2016-12-09 7 views
1

На iOS 10 Я пытаюсь создать совпадение с помощью GKTurnBasedMatchmakerViewController. Я могу отобразить представление, чтобы пользователь мог выбирать сватовство или приглашение. Я не могу понять, как надежно определить, какой матч был создан в ответ на это. Проблема в том, что в iOS 10 метод didFindMatch для GKTurnBasedMatchmakerViewControllerDelegate устарел. Этот метод использовался для вызова с совпадением. Старые времена были легкими!Как надежно определить, какой матч был создан в ответ на успех GKTurnBasedMatchmakerViewController

Сообщение об отказе говорит: «Используйте GKTurnBasedEventListener player: receivedTurnEventForMatch: didBecomeActive». В потоках переполнения документов и стека заполняются причины, по которым этот метод вызывается. См. Эту тему для хорошего списка: Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called. Если вы представляете себе пользователя, у которого уже есть несколько игр, вы увидите, что этот метод будет вызван по разным причинам, и это может произойти в любое время, насколько я знаю. Мой вопрос: как определить, какой из этих вызовов является «Я только что создал для вас матч, вот оно!» вызов.

Некоторых примеров, я думаю, не будут работать:

  • Просто принимая первый вызов receivedTurnEventForMatch, что происходит после того, как вы поднимете GKTurnBasedMatchmakerViewController кажется неправильным, так как receivedTurnEventForMatch может быть уведомлением пользователя о том, что их очередь в другом игра. Если система не гарантирует, что, пока представление будет поднято, они вызовут этот метод только с совпадением, соответствующим представлению. Это похоже на довольно большой взлом, поэтому я предполагаю, что они этого не делают.
  • Призыв к полученномуTurnEventForMatch с другим игроком в состоянии «Соответствие» и didBecomeActive = true, похоже, является решением для первого игрока в матче, но не вторым (так как оба игрока выполнены для соответствия).
  • Посмотрите на MatchID и посмотрим, видели ли мы его раньше, и если нет, считая, что совпадение, которое только что было создано, кажется ненадежным, так как пользователь мог удалить приложение, а затем переустановить и мы забыли все о том, какие совпадения мы «видели раньше».

Я застрял, любая помощь приветствуется.

ответ

0

Дважды проверьте свой статус при срабатывании обработчика событий. Я считаю, что вы все равно должны находиться в состоянии invited, пока не примете матч.

редактировать: На самом деле, я считаю, что будет два условия, которые указывают на новый матч, когда обработчик событий срабатывает:

  1. Вы в приглашаемого состоянии (вы присоединились)

  2. Все остальные в приглашаемого или состоянии automatch (вы начали матч)

edit 2: Проверка моего старого кода, оказалось, что я посмотрел на объект . Поскольку я знал, что игрок 2 не получает приглашение до тех пор, пока игрок1 не закончит поворот (и т. Д.), И так как я знал, что игроку 1 пришлось сохранить совпадающие данные, чтобы закончить ход, если matchData.length был больше нуля, я предположил Я присоединился к игре. Я не полагался на статус участника. Но это не решает вашу проблему.

Другое, что я сделал, это создать мою собственную структуру заголовка, которую я вставил в начале NSData.В этом заголовке player1 установил флаги статуса для каждого другого игрока, что было бы очевидно, когда эти игроки присоединились. Я полностью проигнорировал статус участника в объекте совпадения.

Что касается вашей третьей пули, вместо сохранения локального списка вы можете сохранить ее удаленно с помощью cloudKit. Данные cloudkit будут сохраняться в установках/удаленных операциях, если вы специально не удалите их.

Суть с cloudkit является:

  • когда вы включите его в вашем приложении, ваше приложение получает «контейнер» с публичной базой данных, которая может разделить все пользователь плюс приватной базой данных уникальных для каждого пользователя приложения.
  • Вы можете создать запись в частной базе данных с полем «Bytes»
  • Вы можете сохранить NSMutableArray непосредственно в поле вышеупомянутого Bytes
  • Вы можете прочитать обратно NSMutableArray непосредственно из поля Bytes
+0

Из моего тестирования не работает таким образом: Если я –

+0

от моего тестирования она не работает таким образом: Если я начну автоматический или пригласить игру: я нахожусь в состоянии GKTurnBasedParticipantStatusActive, и соответствующий игрок в GKTurnBasedPartic Статус ipantStatusMatching. Как я упоминал выше: Обнаружение, когда полученоTurnEventForMatch дает вам новую игру для первого игрока в матче, кажется простым: Ищите «подходящее» состояние. Это второй игрок, который является вызовом, поскольку у обоих есть состояние «Активный» (что также относится к множеству других случаев, когда это событие будет вызвано). –

+0

@ Эрик, я достиг своего предела разочарования с помощью 'GK *' и разорвал весь этот код несколько месяцев назад. Итак, мне нужно было посмотреть старые ветви, чтобы посмотреть, что я делал. Я обновил ответ, соответственно. – Thunk