在我们的 iOS 游戏中,我们使用 Game Center 来识别玩家并使用我们自己的服务器跨设备同步他们的数据。因为 Game Center 识别玩家,我们需要知道他们是否经过身份验证,或者他们是否更改了身份验证等。我们有一个标题屏幕,显示“正在初始化 Game Center...”,直到身份验证调用返回,并且只有一次我们知道他们被认证为谁(如果有的话)我们进入游戏。
但是,在极少数情况下(事实上,我自己无法重现它),永远不会调用身份验证处理程序。即使在等待几分钟之后。Game Center 欢迎横幅也从不显示,因此不仅仅是我们的处理程序从未被调用,而是似乎确实没有身份验证状态。
到目前为止,我们已经实现了 30 秒的超时,如果我们没有从 Game Center 听到任何消息,我们假设身份验证状态没有改变,并且我们使用您保存的数据。30 秒的超时并不理想,所以我想知道 GC 没有响应时是否有任何押韵或理由。
下面是从我们的 App Delegateapplication: didFinishLaunchingWithOptions:
方法调用的代码:
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];
}
}];
}