2013-10-18 22 views
9

Stavo cercando di implementare un listener di eventi in un gioco a turni in modo che un giocatore possa ricevere quando è attivo il suo turno o quando viene invitato da un amico. GKTurnBasedEventHandler è deprecato in IOS 7 e ho letto nella documentazione che dovrei usare GKLocalPlayerListener; ma questo è l'estensione di esso. C'è qualcuno che l'ha già usato, perché non ci sono informazioni da nessuna parte.IOS Game Center GKLocalPlayerListener

Questo è quello che ho provato prima, e non funziona.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) 
    { 
     if (localPlayer.isAuthenticated) 
     { 
      GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
      [localPlayer registerListener:self]; 
     } 
    }]; 

    return YES; 
} 

-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite 
{ 
    NSLog(@"test"); 
} 

- (void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive 
{ 
    NSLog(@"test"); 
} 
+0

hai capito o trovato qualcos'altro su questo? sto riscontrando problemi nell'usare GKLocalPlayerListener. la documentazione e gli esempi disponibili sfruttano ancora API deprecate. – iksnae

+0

Non ancora, altre cose urgenti sono venute fuori, ma se lo farò posterò la soluzione. – Macaret

+0

Funziona per me in una certa misura. I metodi sono analoghi a quelli ora deprecati, tranne che viene passato anche il giocatore corrente. Tuttavia, ciò di cui sto avendo problemi è capire quando deere registrare gli ascoltatori, ad es. quando l'app passa da bg/fg. Questo è stato anche un problema per gli ascoltatori di invito in iOS 6. – Drux

risposta

2

Ecco po 'di codice che uso per registrare GKLocalPlayerListener

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
    if (viewController) { 
     [authenticateFromViewController presentViewController:viewController animated:YES completion:^{ 
      [localPlayer registerListener:self]; 
      NSLog(@"Authenticated. Registering Turn Based Events listener"); 
     }]; 
    } else if (localPlayer.authenticated) { 
     [localPlayer registerListener:self]; 
     NSLog(@"User Already Authenticated. Registering Turn Based Events listener"); 
    } else { 
     NSLog(@"Unable to Authenticate with Game Center: %@", [error localizedDescription]); 
    } 
}; 

Gli stati di documentazione che è necessario registrarsi solo per un GKLocalPlayerEventListener una volta così si potrebbe migliorare questo codice controllando se hai già registrato.

Si noti che authenticateWithCompletionHandler è obsoleto in iOS 6 e si consiglia di impostare la proprietà authenticateHandler come ho fatto sopra.

1

Credo che tu fossi lì. Proprio questa volta fai un paio di cose. Assicurati di non aggiungere più listener anche prima di aggiungere un listener, solo in caso di annullamento della registrazione di tutti gli ascoltatori.

Mi sono assicurato che l'ho fatto solo una volta nel mio intero progetto, ma ottengo il giocatore locale più volte.

-(void) onLocalPlayerAuthChanged:(GKLocalPlayer*)authPlayer { 

    [authPlayer unregisterAllListeners]; 
    [authPlayer registerListener:_Whatever_]; 

} 
1

potrei essere un po 'tardi, ma speriamo che aiutare qualcuno là fuori ...

Questo è quello che faccio. Secondo Apple's documentation I creare il [mio] metodo che visualizza una vista di autenticazione quando appropriato per [la mia] app.

- (void)authenticateLocalUser 
    { 
     if ([GKLocalPlayer localPlayer].authenticated == NO) { 
      __weak typeof(self) weakSelf = self; 
      __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer]; 

      weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
       if (viewController != nil) { 
        [weakSelf showAuthenticationDialogWhenReasonable:viewController]; 
       } else if (weakPlayer.isAuthenticated) { 
        // Player has been authenticated! 
        [weakPlayer registerListener:weakSelf]; 
       } else { 
        // Should disable Game Center? 
       } 
      }; 

     } else { 
      // Already authenticated 
      [[GKLocalPlayer localPlayer] registerListener:self]; 
     } 
    } 


    -(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller 
    { 
     [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil]; 
    } 

Questo codice è all'interno di una classe di supporto Singleton, potrebbe essere semplificato se lo avete sulla vostra propria classe.

+0

Grazie mille, era in sospeso dalle ultime 15 ore per me, e la semplice delega è stata menzionata ovunque, ma la sintassi corretta non era disponibile. E l'ho davvero convertito in rapido per il mio scopo. https://stackoverflow.com/questions/44889019/gkturnbasedeventlistener-could-not-be-set-to-delegate-of-my-viewcontroller –