即使身份验证失败,localPlayer仍会进行身份验证

时间:2016-07-11 14:23:22

标签: ios authentication game-center

即使出现身份验证错误,a是否有效?

GKLocalPlayer.localPlayer.authenticateHandler =
  ^(UIViewController *viewController, NSError *error)
{
  if (error)
  {
    bool a = GKLocalPlayer.localPlayer.authenticated;
  }
  else
  {

例如,当我有一个经过身份验证的播放器,将应用移动到后台,禁用WiFi,然后再将应用移动到前台时,会发生这种情况。我希望GameCenter继续使用缓存帐户吗?

我发现手册有点含糊不清。 来自https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW11

“只要您的游戏移动到后台,本地玩家对象的经过身份验证的属性的值就会变为并保持无效,直到您的游戏移回到前台。您无法读取该值以确定该玩家是否是仍然经过身份验证,直到Game Kit重新验证播放器并调用您的身份验证处理程序。在调用完成处理程序之前,您的游戏必须表现为没有经过身份验证的播放器。一旦调用了处理程序,存储在经过身份验证的属性中的值将再次生效。

即使身份验证失败,该值是否有效?

1 个答案:

答案 0 :(得分:1)

我对Apple有一个长期运行的Bug。在正在进行的对话期间,它已被关闭并重新打开。 .authenticated是否有效的问题似乎取决于您的观点

Apple将此视为按预期工作,因为您已缓存信息,Apple认为可让您继续玩游戏,可以显示排行榜等.Apple称.authenticated在此状态下确实有效。我已经看到这个论坛上的一些开发人员同意这个观点,虽然我没有方便他们帖子的链接。

但实际上,如果您在此状态下尝试进行任何后续游戏中心操作,则会因为您未进行真正的身份验证而失败。您无法保存游戏,加载匹配等。您显示的任何排行榜都将是陈旧的缓存数据。

在我看来,苹果公司厌恶让玩家看到基础设施造成的问题。因此,通过这种机制,你试图通过伪造状态向前推进,希望问题能够在以后发挥作用。在我的游戏中,在用户投入时间/精力进入游戏后,该策略永远不会消失并最终达到无法恢复的状态。所以,就像上面的代码一样,我依赖于NSError所说的内容。如果是"错误"然后我将播放器看作未经验证的,提供UI提示来纠正这种情况。

我已在此处详细记录了我的方法:https://stackoverflow.com/a/37216566/1641444