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:completionHan‌​dler:) обработчик завершения:

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()
}
Другие вопросы по тегам