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