2013-10-18 12 views
9

Próbowałem zaimplementować detektor zdarzeń w grze turowej, aby gracz mógł odbierać, gdy jego kolej jest aktywna lub gdy jest zaproszony przez znajomego. GKTurnBasedEventHandler jest przestarzałe w IOS 7 i czytam w dokumentacji, że powinienem używać GKLocalPlayerListener; ale to jest jego zasięg. Czy jest ktoś, kto już go użył, ponieważ nigdzie nie ma informacji.Centrum gier IOS GKLocalPlayerListener

To jest to, co próbowałem wcześniej, i to nie działa.

- (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

wymyśliłeś lub znalazłeś coś jeszcze na ten temat? Mam problem ze znalezieniem czegokolwiek na temat używania GKLocalPlayerListener. dostępna dokumentacja i przykłady nadal wykorzystują przestarzałe interfejsy API. – iksnae

+0

Jeszcze nie, pojawiły się inne pilne sprawy, ale jeśli to zrobię, opublikuję rozwiązanie. – Macaret

+0

To działa dla mnie w pewnym stopniu. Metody są analogiczne do tych teraz uznanych za przestarzałe, z wyjątkiem tego, że obecny gracz również został zaliczony. Jednak mam problem z ustaleniem, kiedy należy wyrejestrować odbiorniki np. gdy aplikacja przełącza się między bg/fg. Był to również problem polegający na zaproszeniu słuchaczy w iOS 6. – Drux

Odpowiedz

2

Oto kod, który używam, aby zarejestrować 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]); 
    } 
}; 

stanach dokumentacji, która należy zarejestrować tylko dla GKLocalPlayerEventListener raz więc można poprawić ten kod, sprawdzając, czy masz już zarejestrowany.

Pamiętaj, że authenticateWithCompletionHandler jest przestarzałe w systemie iOS 6 i zaleca ustawienie właściwości authenticateHandler, tak jak zrobiłem to powyżej.

1

Wierzę, że tam byłeś. Właśnie tym razem zrób kilka rzeczy. Upewnij się, że nie dodajesz wielu słuchaczy również przed dodaniem słuchacza, po prostu zgaś wyrejestruj wszystkich słuchaczy.

Upewniłem się, że zrobiłem to tylko raz w całym moim projekcie, ale wielokrotnie otrzymałem lokalnego gracza.

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

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

} 
1

mogę być trochę późno, ale mam nadzieję, że to pomoże kogoś tam ...

To, co robię. Zgodnie z Apple's documentation I tworzę [moja] własną metodę, która wyświetla widok uwierzytelnienia, gdy jest to właściwe dla [mojej] aplikacji.

- (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]; 
    } 

Ten kod jest wewnątrz singleton klasy pomocnika, to może być uproszczone, jeśli masz go na swojej własnej klasy.

+0

Bardzo dziękuję, czekało mnie od 15 godzin, a delegowanie zostało wymienione wszędzie, ale poprawna składnia nie była dostępna. I naprawdę przerobiłem to na szybkie dla mojego własnego celu. https://stackoverflow.com/questions/44889019/gkturnbasedeventlistener- nie można-setować-do -delegate-of-my-viewcontroller –

Powiązane problemy