有时,从不调用游戏中心身份验证处理程序



在我们的iOS游戏中,我们使用Game Center来识别玩家,并使用我们自己的服务器在设备之间同步他们的数据。由于 Game Center 可识别玩家,因此我们需要知道他们是否已通过身份验证,或者他们是否已更改身份验证等。我们有一个标题屏幕,显示"正在初始化游戏中心..."在身份验证调用返回之前,只有当我们知道他们被认证为谁(如果有的话(时,我们才会进入游戏。

但是,在极少数情况下(实际上,我自己无法重现它(,身份验证处理程序永远不会被调用。即使等待了几分钟也没有。Game Center 欢迎横幅也从不显示,因此不仅我们的处理程序从未被调用,而且似乎确实没有身份验证状态。

到目前为止,我们已经实现了 30 秒超时,如果我们没有从 Game Center 听到任何消息,我们会假设身份验证状态没有更改,并且我们使用你保存的数据。30 秒超时并不理想,所以我想知道 GC 没有响应时是否有任何押韵或理由。

下面是从应用委托的 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沙盒之外遇到过此问题。

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

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

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

此外,值得将NSErrors记录为代码的一部分,以防它试图告诉您被忽略的内容。

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

相关内容

  • 没有找到相关文章

最新更新