1

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

1) 我在应用启动时提示用户登录游戏中心。

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

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

4) 这应该会显示一个他们可以设置在线游戏选项等的屏幕,但我注意到他们没有经过身份验证的玩家,所以……</p>

5) 我再次提示用户登录游戏中心。

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

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

什么是聪明的解决方案?

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

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

我读过的许多示例都假设用户是第一次登录,但我认为情况并非总是如此。

在此先感谢您的帮助!

4

1 回答 1

1

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

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

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

于 2013-05-23T00:06:52.487 回答