GameKit matchmaking falla para conexiones 3G


Estoy haciendo un juego multijugador para iOS y leí el material en Apple Developer Center, específicamente este . Aquí está mi código para el emparejamiento personalizado, que es bastante sencillo:

- (void)findProgrammaticMatch {

    GKMatchRequest *request = [[GKMatchRequest alloc] init];
    request.minPlayers = 2;
    request.maxPlayers = 2;
    request.defaultNumberOfPlayers = 2;
    request.playersToInvite = nil;
    request.playerAttributes = 0;
    request.playerGroup = 0;

    UILabel *loading = (UILabel *)[aiw viewWithTag:792];

    [[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) {
        if (error){

            //error handling
            [loaderLayer stopAnimating];
            UIButton *cancelButton = (UIButton *)[loaderLayer viewWithTag:442];
            [cancelButton setTitle:@"Go Back" forState:UIControlStateNormal];
            loading.text = @"Cannot find any players. Please try again later.";

        } else if (match != nil) {

            //save match
            self.match = match;
            self.match.delegate = self;

            loading.text = @"Found a player. Preparing session...";

            if (!self.matchStarted && match.expectedPlayerCount == 0) {

                self.matchStarted = YES;
                //begin game logic
                [self.scene setState:1];
                self.myTicket = 1000+arc4random_uniform(999);
                [self.scene send:self.myTicket];
                [self stopLoading];
            }

        }
    }];  
}

Sin embargo, el emparejamiento falla cuando uno o más dispositivos están conectados a Internet a través de redes celulares. Cuando investigué el error subyacente, descubrí que incluso si se trata de un caso de wifi a wifi, el controlador de finalización no funciona como estaba previsto. Es decir, match.expectedPlayerCount nunca es 0. En su lugar, el juego comienza cuando - (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state handler es invocado después del handler de finalización de la siguiente manera:

...
- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state {
    switch (state) {
        case GKPlayerStateConnected:
            self.matchStarted = YES;
            //begin game logic
            [self.scene setState:1];
            self.myTicket = 1000+arc4random_uniform(999);
            [self.scene send:self.myTicket];
            [self stopLoading];
            break;
...

El problema ahora es si un dispositivo con 3g está conectado (y coincide-algo así -) didChangeState nunca se invoca. Busqué otras preguntas relacionadas en Internet y en este sitio, aunque están lejos de ser satisfactorias. También leí que los servidores sandbox de Game Center no son confiables y para algunas personas la versión de producción funcionó perfectamente (¡simplemente funciona!) a pesar de los errores en modo sandbox, pero no quiero correr ese riesgo. ¿Alguien ha experimentado un problema similar con su juego multijugador?

Author: MSU_Bulldog, 2015-04-08

3 answers

Hgeg,

No hay nada malo con su código. Usted tiene que permitir el uso de datos móviles a su aplicación que necesita el permiso de los usuarios.

El siguiente párrafo se selecciona desde El sitio web de soporte de Apple :

En la capa de base, puede usar setAllowsCellularAccess: método en NSMutableURLRequest para especificar si se puede enviar una solicitud a través de una conexión celular. También puede utilizar el allowsCellularAccess para comprobar el valor actual.

En la capa de base central, puede lograr lo mismo al establecer la propiedad kcfstreampropertynocelular antes de abrir un flujo obtenido de las API CFSocketStream o CFHTTPStream.

En versiones anteriores de iOS, puede seguir utilizando el kSCNetworkReachabilityFlagsIsWWAN como una forma de mejor esfuerzo de determinar si el tráfico se enviará a través de una conexión celular, pero usted debe ser consciente de sus limitaciones.

Bueno suerte

Iman

 2
Author: Zich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 08:13:17

Según las últimas noticias de Apple, desde iOS 9, el modo sandbox ya no existirá, en lugar del sandbox tendrá un entorno unificado.Medio ambiente unificado

Así que tendrá solo un entorno unificado donde puede compartir las mismas cuentas, esto debería resolver todos los problemas habituales del modo SandBox.

El nuevo Sistema Unificado también es compatible con TestFlight, por lo que podrás probar tu código en varios dispositivos y cuentas.

Todos estos los cambios serán hechos directamente por Apple, por lo que lo único que puedes hacer es esperar hasta que se actualicen al nuevo sistema, hasta ahora es la única manera de estar seguro de que no es un problema de Caja de arena. Para obtener más información, por favor tenga un botín en el WWDC video

 1
Author: Max_Power89,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 14:46:28

Basado en el código que nos ha mostrado, no debería haber ningún problema independientemente del tipo de conexión, 3G o de otro tipo; sin embargo, si previamente intercaló código para el manejo de excepciones que estaba vinculado al estado de conexión, o para gráficos que representan un estado de carga, algo podría estar atado en otro lugar lógicamente y producir este error en este punto de la lógica del juego. Incluso un gráfico de hilandero corrupto puede convertirse en un problema.

¿Tenía otros manejadores de excepciones en el código que llamó lo siguiente:

request.playersToInvite

O

request.playerGroup

O

¿Eso cambió la característica de una capa de cargador?

 0
Author: miniscule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 08:10:00