여러 번 여기에서 다뤘던 아주 오래된 문제에 직면했습니다. 이 문제를 많은 시간 동안 이야기했지만, 나는 받아 들일만한 해결책을 찾지 못했고 그래서 나는 다시 한번 문제를 제기하기로 결정했다.게임 센터 샌드 박스 문제
그래서 문제가 있습니다. 턴 기반 매치를 테스트하려고합니다. 나는 이것을 위해 두 개의 실제 장치를 사용한다. 나는 첫 번째 장치를 켜고 일치 데이터를 오류없이 업데이트합니다 (나는 확실히 알고 있습니다). 그러나 때로는 두 번째 장치가 어떤 알림도받지 못하고 첫 번째 장치가 여전히 켜져있는 것으로 보입니다. 때로는 예상대로 작동합니다.
즉, player(_:receivedTurnEventFor:didBecomeActive)
라는 메서드가 가끔 호출되지 않습니다. 하지만 두 번째 장치에서 응용 프로그램을 닫으면 다시 열어 기존 일치 항목에 모두 연결하면됩니다. 이것은 게임 센터 샌드 박스 문제로 잘 알려져 있지만, 앱을 테스트하는 동안 나에게 미친 짓이됩니다. 해결 방법에 대해 아는 사람이 있습니까? 아니면이 이상한 샌드 박스 동작으로 앱을 실행하고 테스트하는 것이 가장 좋은 방법일까요?
업데이트. 썽크 (Thunk)가 제안한 방법이 해결책입니다. 스위프트에서 다시 작성하고 내 게임 논리와 일치하도록 수정했습니다. 첫째, 나는 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 :)'를 호출함으로써 차례를 끝낸다. 그리고 또 하나. 때로는 예상대로 작동합니다. 두 번째 기기는 전송 직후에 차례를 수신하고 때로는 경기 데이터를 업데이트하기 위해 경기에 다시 참여해야합니다. –