在我们的iOS游戏中,我们使用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];
}
}];
}
答案 0 :(得分:3)
我在沙盒服务器上的一个游戏测试期间有过这方面的经验,有时候确实没有通知或认证处理程序调用,那么它将在半小时后工作。
我们总结说这是Apple的服务器端,因为我们从未在Game Center沙箱之外遇到过这个问题。
很抱歉,解释有点模糊,你无能为力。但这不是你的代码。最终你无法控制。
答案 1 :(得分:0)
尝试收听GKPlayerAuthenticationDidChangeNotificationName
后应在身份验证后通知的内容。这至少可以推断出丢失的消息。
问题可能出在Apple的服务器上。您可以通过从iPhone使用的网络代理运行wireshark跟踪来消除这种情况。如果仅从其他人的手机上看到它,那么可能记录它们所经历的网络连接和可达性,以关联它们的特定网络事件是否应该受到责备。
还值得记录NSErrors
作为代码的一部分,以防它试图告诉你一些被忽视的事情。
答案 2 :(得分:0)
我们在这里遇到了同样的问题,我们意识到只有一些人在wifi上发生过。事实证明,GameCenter需要一些荒谬的防火墙限额才能正常工作:https://support.apple.com/en-us/HT202944 我们认为问题在于某些网络会阻塞这些端口,从而导致呼叫永不响应。