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];
}
}];
}
我读过的许多示例都假设用户是第一次登录,但我认为情况并非总是如此。
在此先感谢您的帮助!