我正在用GameCenter開發一款遊戲,並且我有幾個測試人員在AdHoc(Beta)發行版中使用它,因此他們在我們準備上線時使用Sandbox進行測試。無法預知的GameCenter斷開連接錯誤[Sandbox]
我遇到不可預知的與GameCenter的斷開連接。例如,當使用GKLeaderboard.loadScoresWithCompletionHandler
加載排名最高的排行榜分數時,它將返回NSError
,表示該玩家未通過驗證(即使他在會話開始時進行了身份驗證並且以前的同類請求已成功,錯誤代碼爲#6
)。有時甚至發生在遊戲結束時,在成功完成GKTurnBasedMatch
後,當我試圖向排行榜報告分數時。
有幾件事情我已經注意到:
- 它發生在我的iPad,並經常向我的幾個beta測試者(每天多次),但它從來沒有發生在我的iPhone或某些其他beta測試者,即使玩家在同一時間玩。例如,我可以用我的iPhone和我的iPad玩遊戲,而且iPad會一直遇到這個錯誤,但iPhone永遠不會。
- 它似乎比其他時候更糟糕。例如,我在週一晚上甚至無法打一場單場比賽,我的測試人員也遇到了很多問題,但週二晚上它運行良好。
- 它看起來好像沒有發送認證更改消息(即
setAuthenticateHandler
塊未被調用,也沒有發佈GKPlayerAuthenticationDidChangeNotificationName
)。我的第一個跡象表明出現問題的原因只是GameCenter請求失敗並出現錯誤。
上面讓我覺得像這與沙盒只是不可靠(例如,有人超載週一)的問題。但是,我不能在實時應用程序中冒這種經驗。
所以,我的問題是2部分:
- 任何人能證實的GameCenter是在生產實際可靠,而這些問題僅僅是沙盒?或者至少確認問題不在我的代碼中?
- 我該如何防禦這些類型的錯誤代碼?當我遇到這樣的錯誤時,我試過撥打
[[GKPlayer localPlayer] setAuthenticateHandler:...]
,但似乎沒有對用戶進行重新驗證。
我在沙箱中垃圾郵件與請求遊戲中心時看到類似的行爲。例如,發送太多成就,刪除/發送挑戰等等。根據我的經驗,它似乎是一種反DoS攻擊機制,因爲當您連續發送遊戲中心請求而無需等待先前的請求完成時,它會更頻繁地發生。通過批量處理我的請求並確保先前的請求已完成,然後再發送新請求。希望這可以幫助。 – Dario 2014-09-06 16:09:53
@Dario,非常有幫助,謝謝。我沒有考慮到他們可能會限制客戶的速度,我絕對會相繼提出相當多的要求。 – 2014-09-06 16:40:40