5

iOS ゲームでは、Game Center を使用してプレーヤーを識別し、独自のサーバーを使用してデバイス間でデータを同期しています。Game Center はプレイヤーを識別するため、プレイヤーが認証されているかどうか、または認証を変更したかどうかなどを知る必要があります。認証呼び出しが返されるまで、「Initializing Game Center...」と表示されるタイトル画面が 1 回だけ表示されます。私たちは彼らが誰を認証したかを知っています (誰かがいる場合) 私たちはゲームに参加します.

ただし、ごくまれに (実際、自分で再現することはできません)、認証ハンドラーが呼び出されることはありません。数分待った後でも。Game Center のウェルカム バナーも表示されないため、ハンドラーが呼び出されないだけではなく、実際には認証ステータスがないようです。

これまでのところ、30 秒のタイムアウトを実装しており、Game Center から何も聞こえない場合は、認証ステータスが変更されていないと見なし、保存されたデータを使用します。その 30 秒のタイムアウトは理想的ではないため、GC が応答しない場合に韻や理由があるかどうか疑問に思っています。

application: didFinishLaunchingWithOptions:App Delegate のメソッドから呼び出されるコードは次のとおりです。

PlayerModel *playerModel = [PlayerModel sharedPlayerModel];
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if ([localPlayer respondsToSelector:@selector(setAuthenticateHandler:)])
{
    localPlayer.authenticateHandler = ^(UIViewController *gkViewController, NSError *error)
    {
        if (localPlayer.authenticated)
        {
            [playerModel loadFromGameCenter];
            playerModel.hasGCStatus = TRUE;
            [playerModel sync];
        }
        else if (gkViewController)
        {
            [viewController presentViewController:gkViewController animated:TRUE completion:nil];
        }
        else
        {
            NSLog(@"Could not authenticate with Game Center");
            [playerModel unloadFromGameCenter];
            playerModel.hasGCStatus = TRUE;
            [playerModel sync];
        }
    };
}
else
{
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) {
        if (localPlayer.authenticated)
        {
            [playerModel loadFromGameCenter];
            playerModel.hasGCStatus = TRUE;
            [playerModel sync];
        }
        else
        {
            NSLog(@"Could not authenticate with Game Center");
            [playerModel unloadFromGameCenter];
            playerModel.hasGCStatus = TRUE;
            [playerModel sync];
        }
    }];
}
4

3 に答える 3

3

私は、サンドボックス サーバー上のゲームの 1 つでテスト中にこの経験をしました。実際には、通知または認証ハンドラーの呼び出しがまったくない場合があり、その後 30 分後に機能するだけでした。

Game Center サンドボックス以外でこの問題に遭遇したことはなかったため、Apple のサーバーの終了が原因であると結論付けました。

説明が少し曖昧で申し訳ありません。具体的にできることは何もありません。しかし、それはあなたのコードではありません。それはあなたがコントロールできない端にあります。

于 2013-08-31T13:15:19.820 に答える
0

ここで同じ問題が発生しましたが、wifi を使用している一部の人にのみ発生したことがわかりました。GameCenter が機能するには、途方もない数のファイアウォール許可が必要であることが判明しました: https://support.apple.com/en-us/HT202944 問題は、一部のネットワークがこれらのポートをブロックし、呼び出しがまったく応答しないことであると考えています。

于 2015-10-05T22:01:41.927 に答える