5

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

3 回答 3

3

I had this experience during testing on one of our games on the sandbox server, there really was no notification or authentication handler call sometimes, then it would just work a half hour later.

We summised that it was due to Apple's server end as we never encountered this problem outside of the Game Center sandbox.

Sorry that the explanation is a little vague and there's nothing concrete that you can do. But it's not your code. It's on the end that you cannot control.

于 2013-08-31T13:15:19.820 回答
0

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

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

此外,它值得将其记录NSErrors为代码的一部分,以防它试图告诉你一些被忽视的东西。

于 2013-09-01T13:55:13.913 回答
0

我们在这里遇到了同样的问题,我们意识到这只发生在某些使用 wifi 的人身上。事实证明,GameCenter 需要大量的防火墙许可才能工作: https: //support.apple.com/en-us/HT202944 我们认为问题在于某些网络会阻止这些端口,从而导致呼叫永远不会响应。

于 2015-10-05T22:01:41.927 回答