【发布时间】: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 这很有帮助,谢谢。我没有考虑到他们可能会限制客户端的速率,我肯定会连续发出相当数量的请求。
标签: ios game-center gamekit