不可预测的 GameCenter 断开连接错误 [沙盒]

Posted

技术标签:

【中文标题】不可预测的 GameCenter 断开连接错误 [沙盒]【英文标题】:Unpredictable GameCenter Disconnection Errors [Sandbox] 【发布时间】:2014-09-06 15:58:30 【问题描述】:

我正在使用 GameCenter 开发游戏,并且我有几个测试人员在 AdHoc(Beta)发行版中使用它,因此他们在我们准备上线时使用 Sandbox 进行测试。

我遇到无法预料的与 GameCenter 断开连接的情况。例如,当使用GKLeaderboard.loadScoresWithCompletionHandler 加载最高排行榜分数时,它会返回一个NSError 表示玩家未通过身份验证(错误代码#6,即使他在会话开始和之前的请求中已通过身份验证同类成功)。有时这甚至发生在游戏结束时,在成功完成GKTurnBasedMatch 之后,当我尝试向排行榜报告分数时。

我注意到的一些事情:

    这种情况经常发生在我的 iPad 上(每天几次)和我的几个 beta 测试人员身上,但它从未发生在我的 iPhone 或某些其他 beta 测试人员身上,即使玩家同时玩也是如此。例如,我可以用我的 iPhone 和我的 iPad 玩游戏,iPad 会经常遇到这个错误,但 iPhone 永远不会。 有时似乎比其他时候更糟。例如,周一晚上我什至无法进行单回合比赛,我的 Beta 测试人员当时也遇到了很多问题,但周二晚上效果很好。 似乎没有发送 Authentication Changed 消息(即,setAuthenticateHandler 块未被调用,GKPlayerAuthenticationDidChangeNotificationName 也未被发布)。出现问题的第一个迹象就是 GameCenter 请求失败并出现错误。

以上内容让我感觉这是沙盒不可靠的问题(例如,它在星期一超载)。但是,我不能在实际应用中冒这种体验的风险。

所以,我的问题分为两部分:

    谁能确认 GameCenter 在生产环境中实际上是可靠的,并且这些问题只是沙盒问题?或者至少确认问题不在于我的代码? 如何针对此类错误进行防御性编码?当我遇到此类错误时,我尝试调用[[GKPlayer localPlayer] setAuthenticateHandler:...],但它似乎没有重新验证用户。

【问题讨论】:

在向游戏中心发送请求时,我在沙盒中看到了类似的行为。例如发送太多成就、删除/发送挑战等。以我的经验,这似乎是一种抗 DoS 攻击机制,因为当您连续发送游戏中心请求而不等待上一个请求完成时,这种情况发生的频率更高。我通过批处理我的请求并确保在发送新请求之前完成先前的请求来解决它。希望这会有所帮助。 @Dario 这很有帮助,谢谢。我没有考虑到他们可能会限制客户端的速率,我肯定会连续发出相当数量的请求。 【参考方案1】:

我们面临着类似的问题。一个原因可能是,GameCenter 似乎在主线程上运行了一些保持活动消息。一旦您的代码很快就阻止了这一点,您可能会断开连接。检查你的线程。

您也可以在 Apple 开发者论坛中考虑这个帖子:

https://devforums.apple.com/thread/199452?tstart=0

【讨论】:

以上是关于不可预测的 GameCenter 断开连接错误 [沙盒]的主要内容,如果未能解决你的问题,请参考以下文章

socket 怎么检测连接是不是断开?

GWT 和不可重现的 503 错误

不可预测的 Cloudfront 502 错误

角度 SignalR 经常断开连接并显示错误状态代码 1006

如何处理与 python 套接字的断开连接? (连接重置错误)

客户端立即连接和断开连接而没有错误消息?