Я использую пошаговые матчи Game Center для своей карточной игры. Он чувствует себя хорошо, потому что люди хотят проверить свою электронную почту или написать текст иногда между очередями. Некоторые пользователи заявили, что действительно хотят иметь очень асинхронный игровой опыт.GameKit Пошаговый слушатель не надежно вызывается при изменении matchData
Для людей, которые держат игру открытой между поворотами, я хочу обновить экран, чтобы отразить то, что делают другие игроки на своих поворотах. Я установил слушателя на GKLocalPlayer
, который отвечает на player:receivedTurnEventForMatch:didBecomeActive
. В документации говорится, что это будет вызвано, когда данные сопоставления будут сохранены другим игроком, даже если он не станет чередой игрока (игрок на текущем устройстве). Это не похоже на 100% времени. Фактически, похоже, что он получает только около 1 в 3 раза, что соответствует данным, которые сохраняются другими игроками. Кажется более надежным, когда он становится чередой игрока, но даже это не на 100% надежнее.
Я использую saveCurrentTurnWithMatchData:completionHandler:
на GKTurnBasedMatch
сохранить данные матча, не конец очереди текущего игрока, и я звоню endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:
на GKTurnBasedMatch
, чтобы сохранить данные, когда это закончится поворот текущего игрока. Есть несколько сценариев, в которых я хочу позвонить saveCurrentTurn…
с обновленными matchData. В моей игре вы можете иметь компьютеры, играющие в вашей многопользовательской игре. Таким образом, игрок может сыграть карту, а затем компьютер может сыграть карту до того, как закончится поворот GKPlayer
. Существуют также сценарии, в которых отдельный игрок может играть дважды. (например, игрок играет на последней карте с трюком. Этот игрок делает трюк и получает возможность провести следующий трюк.)
Я установил тонну регистрации в этом поле, и я вижу ясные сценарии, когда одно устройство звонки saveCurrentTurn…
, а завершениеHandler вызывается без ошибки, а другое устройство не получает уведомление с вызовом player:receivedTurnEvent…
. Я также добавил регистрацию, чтобы проверить, что каждый раз, когда я звоню , я вызываю его с новыми matchData. Я не делаю лишних звонков.
Если я перехожу на устройство, которое не получает обновленную matchData и заставляет его снова загружать matchData для соответствия, он получает обновленные данные. Таким образом, это определенно становится спасенным.
Я пробовал регулировать звонки до saveCurrentTurn…
, чтобы они не происходили в непосредственной последовательности, и это не помогло.
Оба устройства в моем тестировании работают под управлением iOS 8.4. Кажется, что проблема в iOS 8.3 была исправлена (see this question). This Apple forum post также сообщает об этой проблеме 2 года назад, и, похоже, отчеты об ошибках были зарегистрированы и отмечены исправленными.
Кто-нибудь еще видел это? Я хотел бы знать, что я делаю что-то неправильно. Любые идеи очень приветствуются.
Это действительно интересно. Спасибо за обмен вашего опыта. Удивительно, что так сложно найти информацию об этом, что происходит с другими людьми. Я собираюсь оставить этот вопрос еще немного в отчаянной надежде, что есть решение. Если ничего не появится, я отмечу это как ответ. – dontangg
У меня такие же проблемы. Возможно, мне придется обратиться к таймеру (№5). Я действительно не хочу, но похоже, что это мой единственный вариант. Вы можете увидеть мой вопрос здесь: http://stackoverflow.com/questions/34570404/how-do-i-reply-to-a-gkturnbasedexchange-gklocalplayerlistener-delegate-received. Вы все еще замечаете такое поведение? – STANGMMX