2013-08-23 14 views
5

Nel nostro gioco iOS, utilizziamo Game Center per identificare i giocatori e sincronizzare i loro dati su dispositivi utilizzando i nostri server. Poiché Game Center identifica i giocatori, dobbiamo sapere se sono autenticati o se hanno cambiato l'autenticazione, ecc. Abbiamo una schermata del titolo che mostra "Inizializzazione Game Center ..." finché la chiamata di autenticazione non ritorna, e solo una volta sappiamo chi sono autenticati come (se qualcuno) entriamo nel gioco.Talvolta il gestore di autenticazione del Game Center non viene mai chiamato

Tuttavia, una quantità molto piccola di tempo (in effetti, non riesco a riprodurlo da solo), il gestore di autenticazione non viene mai chiamato, mai. Neanche dopo minuti di attesa. Il banner di benvenuto di Game Center non viene mai visualizzato, quindi non è che solo il nostro gestore non viene mai chiamato, ma in realtà non esiste uno stato di autenticazione, a quanto pare.

Finora abbiamo implementato un timeout di 30 secondi in cui, se non sentiamo nulla da Game Center, assumiamo che lo stato di autenticazione non sia cambiato e utilizziamo i dati salvati. Il timeout di 30 secondi non è l'ideale, quindi mi chiedo se ci sia qualche rima o motivo per cui GC non risponde.

Qui è il codice che viene chiamato da nostro metodo di App delegato application: didFinishLaunchingWithOptions::

PlayerModel *playerModel = [PlayerModel sharedPlayerModel]; 
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
if ([localPlayer respondsToSelector:@selector(setAuthenticateHandler:)]) 
{ 
    localPlayer.authenticateHandler = ^(UIViewController *gkViewController, NSError *error) 
    { 
     if (localPlayer.authenticated) 
     { 
      [playerModel loadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
     else if (gkViewController) 
     { 
      [viewController presentViewController:gkViewController animated:TRUE completion:nil]; 
     } 
     else 
     { 
      NSLog(@"Could not authenticate with Game Center"); 
      [playerModel unloadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
    }; 
} 
else 
{ 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) { 
     if (localPlayer.authenticated) 
     { 
      [playerModel loadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
     else 
     { 
      NSLog(@"Could not authenticate with Game Center"); 
      [playerModel unloadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
    }]; 
} 
+0

Sei sicuro che localPlayer non sia zero? Avete qualche ipotesi con la versione iOS che il gestore non viene chiamato? È la versione finale o beta? Se iOS 7 beta, inserisci una segnalazione di bug su Apple. Sei sicuro di non impostare il gestore di completamento su nil otherwhere? – Gougou

+0

Cosa succede? Registra l'errore o nulla? Sarebbe bene sapere qual è l'output, quando il centro del gioco non ha funzionato. – Binarian

+0

@Gougou questo è successo su iOS 6 in base alle mie conoscenze, non alle versioni beta. –

risposta

3

Ho avuto questa esperienza durante i test su uno dei nostri giochi sul server sandbox, c'era davvero alcuna notifica o l'autenticazione chiamata gestore a volte, poi lavorerebbe solo mezz'ora dopo.

Abbiamo riassunto che era dovuto al server Apple perché non abbiamo mai riscontrato questo problema al di fuori della sandbox di Game Center.

Mi dispiace che la spiegazione sia un po 'vaga e non c'è nulla di concreto che tu possa fare. Ma non è il tuo codice. È alla fine che non puoi controllare.

+0

Questa è probabilmente la migliore risposta disponibile.Non lo accetterò, nella speranza che ci sia un'altra risposta là fuori (la taglia è comunque scaduta). Grazie comunque. –

+0

Nessun problema, a volte i servizi di Apple si sentono come se fossero in flusso e non esiste un modo soddisfacente per ottenere un modo soddisfacente di cogliere tutti i problemi che causa. –

+0

@RuddZwolinski hai questo problema sul server principale del game center (ad esempio non una sandbox)? Perché ho lo stesso problema, tranne che nel mio caso questo non è un evento casuale. Succede quando cancello il modulo di login, quindi pop da questo controller di visualizzazione al precedente. E poi chiama l'autenticazione ancora una volta. La seconda volta non ricevo alcuna risposta. Non so cosa fare =/Sono su un centro di gioco sandbox. –

0

Provare ad ascoltare GKPlayerAuthenticationDidChangeNotificationName che dovrebbe essere notificato dopo l'autenticazione. Questo almeno potrebbe dedurre un messaggio mancante.

È possibile che il problema sia nei server Apple. Puoi eliminarlo eseguendo una traccia wireshark da un proxy di rete che il tuo iPhone utilizza. Se è visto solo dai telefoni di altre persone, allora forse registra la connettività di rete e la raggiungibilità che hanno esperienza per correlare se sono da biasimare particolari eventi di rete da parte loro.

Inoltre, è consigliabile registrare lo NSErrors come parte del codice nel caso in cui cerchi di dirti qualcosa che viene trascurato.

0

Abbiamo riscontrato lo stesso problema qui che abbiamo realizzato solo per alcune persone sul wifi. Risulta che GameCenter richiede un ridicolo numero di permessi del firewall per funzionare: https://support.apple.com/en-us/HT202944 Riteniamo che alcune reti blocchino queste porte e quindi la chiamata non risponda mai.

Problemi correlati