【问题标题】:Is localPlayer still authenticated, even if authentication failslocalPlayer 是否仍然经过身份验证,即使身份验证失败
【发布时间】:2016-08-01 03:55:15
【问题描述】:

即使出现身份验证错误,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 重新对玩家进行身份验证并调用您的身份验证处理程序之前仍然进行身份验证。在调用完成处理程序之前,您的游戏必须表现得好像没有经过身份验证的玩家一样。一旦您的处理程序被调用,存储在经过身份验证的属性中的值将再次有效。

即使认证失败,该值是否有效?

【问题讨论】:

    标签: ios authentication game-center


    【解决方案1】:

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

    Apple 认为这是按预期工作的,因为您缓存了 Apple 认为可以让您继续玩游戏的信息,您可以显示排行榜等。Apple 表示 .authenticated 在这种状态下确实有效。我在这个论坛上看到一些开发者同意这个观点,尽管我没有方便的链接到他们的帖子。

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

    在我看来,Apple 讨厌玩家看到他们的基础设施导致的问题。因此,通过这种机制,您尝试通过伪造状态来推动前进,希望问题稍后自行解决。在我的游戏中,这种策略永远不会成功,并最终在用户投入时间/精力到游戏之后 达到不可恢复的境地。因此,就像您上面的代码一样,我依赖 NSError 所说的内容。如果显示“错误”,那么我将播放器视为未经身份验证,提供 UI 提示来纠正这种情况。

    我在此处记录了有关我的方法的更多详细信息:https://stackoverflow.com/a/37216566/1641444

    【讨论】:

    • 在移动环境中,您无法保证连接性,所以也许苹果的方法是要走的路? authenticated 属性说明身份验证状态,并在需要时通过使用缓存信息来实现。不保证下一次网络操作一定会成功。怎么可能?
    • 公平点。我的抱怨是当它已经知道它无法连接时,比如在飞行模式下,但仍然报告经过身份验证。或者报告缓存结果而不告诉我。我在我的错误中建议将其设置为 3 状态值:已验证、未验证和缓存。然后我会完全了解我所处的状态,并可以选择如何进行。这可能是一个有争议的问题。我严重怀疑他们会改变什么。
    猜你喜欢
    • 2018-11-02
    • 2017-11-27
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多