在我们的 iOS 游戏中,我们使用 Game Center 来识别玩家并使用我们自己的服务器跨设备同步他们的数据。因为 Game Center 识别玩家,我们需要知道他们是否经过身份验证,或者他们是否更改了身份验证等。我们有一个标题屏幕显示“正在初始化 Game Center ...”,直到身份验证调用返回,并且只有一次我们知道他们被认证为谁(如果有的话)我们是否进入游戏。
但是,在极少数情况下(事实上,我自己无法重现),永远不会调用身份验证处理程序。甚至在等待几分钟之后。 Game Center 欢迎横幅也从不显示,所以这不仅仅是我们的处理程序从未被调用,而是似乎确实没有身份验证状态。
到目前为止,我们已经实现了 30 秒的超时,如果我们没有从 Game Center 听到任何消息,我们会假设身份验证状态没有改变,并且我们会使用您保存的数据。 30 秒超时并不理想,所以我想知道 GC 何时不响应是否有任何规律或原因。
这是从我们的 App Delegate 的 application: 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];
}
}];
}
最佳答案
我在沙盒服务器上测试我们的一款游戏时有过这样的经历,有时确实没有通知或身份验证处理程序调用,然后它会在半小时后工作。
我们推测这是由于 Apple 的服务器端造成的,因为我们从未在 Game Center 沙箱之外遇到过此问题。
抱歉,解释有点含糊,您无能为力。但这不是你的代码。结局是你无法控制的。
关于ios - 有时永远不会调用 Game Center 身份验证处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392888/