iOS пошаговое совпадение, push-уведомления не работают, функции GKTurnBasedEventListener не вызваны
В моем пошаговом матче на iOS я пытаюсь получать уведомления и получать
public func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)
быть призванным, но безуспешно.
Я регистрирую свою модель представления для локального игрока
GKLocalPlayer.localPlayer().register(self)
и я ожидаю, что стрелять после того, как другой игрок выполняет
func endTurn(withNextParticipants nextParticipants: [GKTurnBasedParticipant], turnTimeout timeout: TimeInterval, match matchData: Data, completionHandler: ((Error?) -> Swift.Void)? = nil)
но безуспешно
Если я заставлю перезагрузить matchData, я получу данные, которые только что отправил второй игрок. Так что endTurn работает правильно.
Я что-то не так делаю?
Обновление: Итак, я создаю новый проект, скопировал все мои файлы, в возможностях был включен только Game Center.
При разработке он работал идеально, у меня было два подключенных устройства (с разными идентификаторами яблок). Уведомления работали, и Turnbasedlistener стрелял.
Как только я выпустил его для внутреннего тестирования, он перестал работать!!!
2 ответа
То, что в итоге сработало для меня, заключалось в тестировании на реальном устройстве, а не на симуляторе. Кажется, что функция receiveTurnEvents не работает в симуляторе.
Работа вокруг Григория отлично подходит для тестирования с симулятором.
У меня была очень похожая проблема. Мое решение состояло в том, чтобы вручную перепроверить мой статус в ожидании своей очереди. Во-первых, я определил глобальную переменную var gcBugTimer: Timer
В endTurn(withNextParticipants:turnTimeOut:match:completionHandler:)
обработчик завершения:
let interval = 5.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()
}