ここでは何度も説明した非常に古い問題に直面しました。多くの時間問題を話していたにもかかわらず、私は受け入れられる解決策が見つからなかったので、私は再び問題を提起することにしました。Game Center Sandboxの問題
だから、問題です。私はターンベースの試合を試してみようとしています。私はこれに2つの実際のデバイスを使用します。私は最初のデバイスをオンにし、一致データはエラーなしで更新されます(私は確かにそれを知っています)が、時には2番目のデバイスは通知を受信せず、最初のデバイスがまだターンに入っているようです。場合によっては期待どおりに動作します。
つまり、player(_:receivedTurnEventFor:didBecomeActive)
というメソッドが呼び出されないことがあります。しかし、私が2番目のデバイスのアプリケーションを閉じると、再び開き、既存のマッチに参加するとすべて正常に動作します。 これはGame Center Sandboxのよく知られた問題ですが、アプリをテストしようとしているうちに私は狂っています。 回避策の方法を知っている人はいますか?または、この奇妙なサンドボックスの動作でアプリを生きてテストする方法がベストプラクティスですか?
更新。 サンクが提案した方法は解決策です。私はそれをSwiftに書き直して、自分のゲームロジックに合わせて修正しました。 最初は、私はendTurn(withNextParticipants:turnTimeOut:match:completionHandler:)
完了ハンドラでグローバル変数 var gcBugTimer: Timer
定義:プレイヤーが順番に新しい一致し、他のプレイヤーにjoyingされたときにも、上記
let interval = 3.0
self.gcBugTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(self.isMatchActive), userInfo: nil, repeats: true)
self.gcBugTimer.tolerance = 1.0
コードがケースに呼び出されなければなりません。
その後タイマー方法:
func isMatchActive() {
// currentMatch - global variable contains information about current match
GKTurnBasedMatch.load(withID: currentMatch.matchID!) { (match, error) in
if match != nil {
let participant = match?.currentParticipant
let localPlayer = GKLocalPlayer.localPlayer()
if localPlayer.playerID == participant?.player?.playerID {
self.player(localPlayer, receivedTurnEventFor: match!, didBecomeActive: false)
}
} else {
print(error?.localizedDescription ?? "")
}
}
}
そして、私はplayer(_:receivedTurnEventFor:didBecomeActive)
の先頭に次のコードを追加します。
if gcBugTimer != nil && gcBugTimer.isValid {
gcBugTimer.invalidate()
}
、あなたはターン内のマッチデータを保存、または終了を参照しているだけで明確にするために、一緒にターン?どちらもさまざまな時に通知を破棄しています。 – Thunk
私のゲームのロジックによれば、ターン内にデータを保存する必要はありません。ですから、私は 'endTurn(withNextParticipants:turnTimeOut:match:completionHandler:)'を呼ぶだけで終了します。そしてもう一度。時にはそれは私の期待どおりに動作します - 2番目のデバイスは送信直後にターンを受信し、時にはマッチデータを更新するためにマッチに再び参加する必要があります。 –