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];
}
}];
}
我读过的很多例子都假设用户第一次登录,但我认为并不总是这样。
提前感谢您的帮助!
答案 0 :(得分:1)
对此的一个解决方案是不让完成处理程序更改您的视图。这看起来很奇怪,因为完成处理程序是异步调用的,并且可能在您请求身份验证后的任何时候发生。
相反,完成处理程序可以检查您是否在在线菜单中并为您启用按钮。在此之前,禁用这些按钮并显示“等待游戏中心”的消息。关键是不要在完成处理程序中触发任何场景转换。这将是糟糕的设计,因为您不知道何时调用此块。
另一个暗示。如果用户拒绝登录游戏中心,则您的身份验证请求在某些时候不会提示用户。如果我没记错的话,您会立即收到GKErrorUserDenied
。因此,您应告诉用户他们可以在Game Center应用程序中启动您的游戏。