2015-08-06 9 views
5

Come indicato dalle linee guida della mela; Ho implementato il protocollo GKLocalPlayerListener nel mio gioco di classe centro e aggiungi il giocatore locale come ascoltatore, non appena ha autenticato: implementazioneIl protocollo GKLocalPlayerListener non viene chiamato

func authenticationChanged() { 
    if (GKLocalPlayer.localPlayer().authenticated && !self.userAutenticated) { 
    println("Authentication changed: player authenticated.") 
    userAutenticated = true 
    GKLocalPlayer.localPlayer().unregisterAllListeners() 
    GKLocalPlayer.localPlayer().registerListener(self) 
    } else if (GKLocalPlayer.localPlayer().authenticated && self.userAutenticated) { 
    println("Authentication changed: player not authenticated.") 
    userAutenticated = false 
    } 
} 

Protocollo:

// MARK: - GKLocalPlayerListener 
func player(player: GKPlayer!, didAcceptInvite invite: GKInvite!) { 
    println("Did accept invite") 
} 
func player(player: GKPlayer!, didRequestMatchWithRecipients recipientPlayers: [AnyObject]!) { 
    println("Did request matchmaking") 
} 

Nessuno di questo 2 metodi si chiama quando Cerco di invitare un amico e anche io non ho ricevuto alcun tipo di notifica. Ho provato a testare il gioco in modalità di rilascio ma ho ottenuto lo stesso risultato. Devo dire che il normale matchmaking funziona correttamente, sono in grado di trovare il giocatore con cui giocare senza problemi.

EDIT:

Se i test test da 2 dispositivi, la notifica sarà ricevuto, ma se mi tocca sulla notifica, l'applicazione sarà aperto e nessun delegato sarà chiamato. Se chiudo l'app e la riavvio, viene chiamato lo GKLocalPlayerListener.

Cosa c'è che non va ??

+0

Probabilmente solo bisogno di chiamare 'unregisterAllListeners' se l'autenticazione viene modificata su false. –

+0

No, non ha risolto il problema. L'utente è autenticato correttamente e il delegato non funziona –

risposta

0

Suppongo che, quando si dice "il matchmaking normale funziona" che avete presentato una matchmakerviewcontroller:

-(IBAction)setupMatch:(id)sender{ 
GKMatchmakerViewController *matchViewController = [[GKMatchmakerViewController alloc] initWithMatchRequest:matchRequest]; 
matchViewController.matchmakerDelegate = self; 
[self presentViewController:matchViewController animated:YES completion:nil];} 

Poi, quando i giocatori si trovano nel didFindMatch matchmakerviewcontroller si chiamerà:

-(void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match{ 
//Called when GameCenter completes the matchmaking process 
match.delegate = (id)self; //etc. lots of your own code here. 

didAcceptinvite viene chiamato sul dispositivo del destinatario di un invito solo dopo aver accettato l'invito:

-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite{ 
//Called on the accepting device when the invitation is accepted 
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:invite]; 
mmvc.matchmakerDelegate = self; 
[self presentViewController:mmvc animated:YES completion:nil]; 

}

Che presenta un controllore matchmakerview al tuo amico. Non c'è niente da fare per loro, la vc crea la connessione e poi si congeda da sola. La vc sul dispositivo mittenti si chiude allo stesso tempo.

Quindi didFindMatch viene chiamato su entrambi i dispositivi e via.

Non sono convinto che sia stato chiamato maiReteRestMatchWithRecipients e sembra ridondante quando FindMatch e didAcceptInvite hanno affrontato l'inizio del gioco ad entrambe le estremità.

ho trovato questo video dal WWDC 2012 veramente utile: WWDC 2012 Christy Warren