如何避免Game Center身份验证重复其阻止

时间:2013-05-22 22:57:29

标签: ios gamekit

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

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

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

3)在某些时候,他们决定要在线玩,所以他们点击我的“在线播放”按钮。

4)这应该显示一个屏幕,他们可以设置在线游戏选项等,但我注意到他们没有经过身份验证的播放器,所以...

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

6)用户登录此时间,并在完成处理程序中显示我的在线游戏选项屏幕。

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

这是什么智能解决方案?

作为参考,我的代码的简化版本如下所示:

- (IBAction)playOnlineTapped:(id)sender
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) {
    if (localPlayer.authenticated) {
            [self showOnlineGameOptions];
    }
    }];
}

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对此的一个解决方案是不让完成处理程序更改您的视图。这看起来很奇怪,因为完成处理程序是异步调用的,并且可能在您请求身份验证后的任何时候发生。

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

另一个暗示。如果用户拒绝登录游戏中心,则您的身份验证请求在某些时候不会提示用户。如果我没记错的话,您会立即收到GKErrorUserDenied。因此,您应告诉用户他们可以在Game Center应用程序中启动您的游戏。