GameCenter authenticate:GKErrorDomain Code=2 "The requested operation has been cancelled."

2228 ワード

GameCenterのログインauthencitateをテストします.ログイン方法は以下の通りです.
-(void) authenticateLocalPlayer {
    GKLocalPlayer* localPlayer =
    [GKLocalPlayer localPlayer];
    
    localPlayer.authenticateHandler =
    ^(UIViewController *viewController,
      NSError *error) {
        
        [self setLastError:error];
        
        if (CCDirector::sharedDirector()->isPaused()) {
            CCDirector::sharedDirector()->resume();
        }
        
        // Player already authenticated
        if (localPlayer.authenticated) {
            _gameCenterFeaturesEnabled = YES;
        } else if(viewController) {
            CCDirector::sharedDirector()->pause();
            [self presentViewController:viewController];
        } else {
            _gameCenterFeaturesEnabled = NO;
        }
    };
}

GameCenterを使用してシミュレータ上で正常に動作し、ホスト上で初めてログインしたときにNSErrorエラーメッセージが表示されました.
GKErrorDomain Code=2 "The requested operation has been cancelled."

通常のログインでは、Apple IDがデフォルトでログインしている場合は、XXを歓迎するインタフェースがポップアップされます
最初のログインでは、GameCenterがAppleIDにログインするプロンプトボックスがポップアップされます
localPlayer.authenticated値falseはログインに失敗したことを示していますが、私のAppleIDはすでにログインしており、通常は失敗すべきではありません.
最後にstackoverflow上の兄弟たちの方法で問題を解決したのは、ログイン関数とシミュレータ上の関数がバインドされているためかもしれない.の原因はあまり重要ではなく、重要な解決策です.
ViewLoadで次の関数を呼び出します.
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"gamecenter:"]];

APPIDを登録して
log outログアウト上のコードをプログラムから削除
もう一度本物でプログラムをデバッグすればいいです.
解決策リファレンス:stackoverflow
GameCenterへのログインには注意が必要です.
1.ios6.0以降は手動でauthenticateHandlerを設定する必要があります.a u t h e nticateWithCompletionHandler:すでに6.0で廃棄されています.
2.authenticationHandler最初のパラメータviewController AppleIDが登録されていない場合は手動で「GameCenterにログイン」画面を表示する必要があります.また、ロジックの一時停止に注意する必要があります.
localPlayer.authenticateHandler =
    ^(UIViewController *viewController,
      NSError *error)
3.このログインblock関数は、3つの場合に呼び出されます.
authenticationHandlerを設定し、プレイヤーの検証を要求すると.
appがforeground(フロント)に入ると.
ログイン時には、例えばプレイヤーがゲームに入る前にログインしていない場合、ログインインタフェースがポップアップされ、このインタフェースの任意のインタラクションでauthenticationHandlerが呼び出されます.