2013-08-25 56 views
2

我嘗試使用下面的代碼來驗證本土球員:遊戲中心身份驗證本土球員

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
if(!localPlayer.authenticated) { 
    localPlayer.authenticateHandler = ^(UIViewController* controller, NSError *error) { 
     if(controller != nil) 
      [self presentModalViewController:controller animated:YES]; 
    }; 
} 

但問題是,即使[GKLocalPlayer localPlayer].authenticated是假的,那就是在authenticationHandler塊返回控制器總是零。因此玩家中心似乎總是被禁用。

回答

0

該問題是由authenticateHandler被設置兩次引起的。處理程序應該在應用程序的生命週期中設置一次。在第一次之後設置的後續authenticateHandler屬性將產生意外的結果,例如問題中描述的問題。

+0

請您可以張貼代碼的解決方案。我有完全相同的問題:( – Supertecnoboff

+1

一個沒有發佈解決方案 –

+0

@Supertecnoboff對不起,我沒有代碼了;我認爲它已被刪除。 – Akash

1

我發現這個認證碼工作正常的iOS 8

- (void)authenticateLocalPlayer 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    if (localPlayer.isAuthenticated) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:LocalPlayerIsAuthenticated object:nil]; 
     return; 
    } 

    localPlayer.authenticateHandler = 
^(UIViewController *viewController, NSError *error) { 
     [self setLastError:error]; 

     if(viewController != nil){ 
      [self setAuthenticationViewController:viewController]; 
     } else if([GKLocalPlayer localPlayer].isAuthenticated) { 
      NSLog(@"connected to gk"); 
      _GKConnected = YES; 
      [[NSNotificationCenter defaultCenter] postNotificationName:LocalPlayerIsAuthenticated object:nil]; 
     } 
     else { 
      _GKConnected = NO; 
     } 
    }; 

    // REGISTER LISTENER FOR INVITES 
    [localPlayer registerListener:self]; 
} 

通知字符串可以是任何常量字符串(它是一個前綴反向DNS的使用與通知中心org.myapp.notificationname好的做法)。

在原來的OP的問題是在檢索了authenticated屬性的getter在GKPlayer情況下的錯誤:屬性名是authenticated但吸氣必須是isAuthenticated

找出這些語義拼寫錯誤可能很平凡,而編譯器不會警告您,因爲它可能是更多的代碼,在使用點符號訪問的簡單屬性後面,默認設置者以is開頭。

順便說一句,我可以添加一個鏈接到一個衆所周知的教程,工作示例教程:

http://www.raywenderlich.com/60998/game-center-tutorial-how-to-make-a-simple-multiplayer-game-with-sprite-kit-part-2

相關問題