如何避免Game Center认证重复其块



Game Kit存储了对我发送给authenticateWithCompletionHandler:的完成处理程序的强引用,这意味着每次用户退出并进入应用程序时,它都会被再次调用。这是有意义的,但它会导致一个用例的问题:

1)当应用程序启动时,我提示用户登录Game Center。

2)他们点击取消,因为他们想玩一段时间的单人游戏。因此,他们没有登录。

在某些时候,他们决定他们想要在线玩,所以他们点击了我的"在线玩"按钮。

4)这应该显示一个屏幕,他们可以设置在线游戏选项等,但我注意到他们没有认证的玩家,所以…

5)再次提示用户登录Game Center。

6)用户这次登录,在完成处理程序中,我显示了我的在线游戏选项屏幕。

步骤6是问题所在:每次用户离开并重新进入应用时,它都会显示我的游戏选项屏幕,因为我的完成处理程序是重复的。如果我拿出完成处理程序中的代码来显示在线游戏选项,用户必须点击两次按钮——一次登录,再一次显示在线选项。

聪明的解决方案是什么?

作为参考,我的代码的简化版本如下:
- (IBAction)playOnlineTapped:(id)sender
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) {
    if (localPlayer.authenticated) {
            [self showOnlineGameOptions];
    }
    }];
}

我读过的许多例子都假设用户是第一次登录的,但我认为情况并不总是这样。

提前感谢您的帮助!

一个解决方案是不让完成处理程序更改视图。这似乎是一个奇怪的想法,因为完成处理程序是异步调用的,并且可以在请求身份验证后的任何时间发生。

相反,完成处理程序可以检查您是否在在线菜单中并为您启用按钮。在此之前,请禁用这些按钮,并显示"等待Game Center"的消息。关键是不要在你的完成处理程序中触发任何场景转换。这将是一个糟糕的设计,因为你不知道这个块何时被调用。

另一个提示。如果用户拒绝登录Game Center,你的认证请求在某些时候不会提示用户。如果我没记错的话,你会立即收到GKErrorUserDenied。因此,你应该告诉用户他们可以从game Center应用中启动你的游戏。

最新更新