有时永远不会调用Game Center身份验证处理程序

时间:2013-08-23 00:32:55

标签: ios authentication timeout game-center gamekit

在我们的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];
        }
    }];
}

3 个答案:

答案 0 :(得分:3)

我在沙盒服务器上的一个游戏测试期间有过这方面的经验,有时候确实没有通知或认证处理程序调用,那么它将在半小时后工作。

我们总结说这是Apple的服务器端,因为我们从未在Game Center沙箱之外遇到过这个问题。

很抱歉,解释有点模糊,你无能为力。但这不是你的代码。最终你无法控制。

答案 1 :(得分:0)

尝试收听GKPlayerAuthenticationDidChangeNotificationName后应在身份验证后通知的内容。这至少可以推断出丢失的消息。

问题可能出在Apple的服务器上。您可以通过从iPhone使用的网络代理运行wireshark跟踪来消除这种情况。如果仅从其他人的手机上看到它,那么可能记录它们所经历的网络连接和可达性,以关联它们的特定网络事件是否应该受到责备。

还值得记录NSErrors作为代码的一部分,以防它试图告诉你一些被忽视的事情。

答案 2 :(得分:0)

我们在这里遇到了同样的问题,我们意识到只有一些人在wifi上发生过。事实证明,GameCenter需要一些荒谬的防火墙限额才能正常工作:https://support.apple.com/en-us/HT202944 我们认为问题在于某些网络会阻塞这些端口,从而导致呼叫永不响应。