Удаление GKTurnBasedMatch, находящегося в недопустимом состоянии

Я провожу некоторые эксперименты, чтобы попытаться узнать о GameKit, и я сделал простую игру и интерфейс, в котором перечислены совпадения моего игрока. Я пытаюсь добавить возможность удалять игры с помощью метода removeWithCompletionHandler: в матче, но у меня возникают проблемы с удалением GKTurnBasedMatch, который, похоже, перешел в недопустимое состояние.

po рассматриваемого совпадения печатает:

$0 = 0x1d590d20 <GKTurnBasedMatch 0x1d590d20 id:858d8257-cc49-4060-b1d8-38c09a929e3c status:Ended message: taken:2013-03-08 18:08:47 +0000 created:2013-03-08 03:24:14 +0000
current:<GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
participants:
    <GKTurnBasedParticipant 0x1d58bc90 - id:G:1717239488 status:Done outcome:Quit lastTurn:2013-03-08 18:08:47 +0000>
    <GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
>

Что, кажется, указывает на то, что матч был закончен. Тем не менее, у одного из участников есть результат: Нет, который, как я считаю, документация недействителен для законченной игры. Попытка просто удалить игру дает:

Запрошенные операции не могут быть выполнены, так как один или несколько параметров недействительны.

При попытке установить исходы и завершить игру выдает:

Запрошенная операция не может быть завершена, так как сеанс находится в недопустимом состоянии.

Я думал, что, возможно, я не могу удалить игру, потому что локальный игрок является активным участником, но оба participantQuitInTurnWithOutcome:... и endTurnWithNextParticipants:... выдают ошибку:

Запрошенная операция не может быть завершена, так как сеанс находится в недопустимом состоянии.

также. Я что-то не так делаю или как-то создал неудаляемую игру?

P.S. Я также не могу удалить игры через интерфейс Game Center, где они перечислены в разделе «Игра окончена».


person Zach    schedule 12.03.2013    source источник


Ответы (5)


Вот как мне удалось удалить все недействительные совпадения.

Я проверял статус текущего участника, если он приглашен, я вызывал rejectInviteWithCompletionHandler, иначе я вызывал участникаQuitInTurnWithOutcome.

Затем в обоих блоках завершения я вызвал removeWithCompletionHandler, чтобы удалить совпадение.

Это вызвало несколько ошибок, но совпадения все равно были удалены, поэтому мой список чист.

И вот обходной путь, как избежать попадания в это состояние для начала. У этого есть дополнительное преимущество, заключающееся в том, что приглашенный даже не получит уведомление, если приглашающий выходит, не закончив свой первый ход.

В playerQuitForMatch сначала завершить ход, а затем в обработчике завершения немедленно выйти из матча. Вот так,

[match endTurnWithNextParticipants:[NSArray arrayWithObject:nextParticipant]
                                          turnTimeout:GKTurnTimeoutDefault
                                            matchData:nil completionHandler:^(NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                }

                                                [match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
                                                                     withCompletionHandler:^(NSError *error) {
                                                                         if (error) {
                                                                             NSLog(@"%@" ,error);
                                                                         }
                                                                     }];
                                            }];
person Henrik    schedule 22.04.2013

К сожалению, я столкнулся с точно такой же ошибкой. Чтобы помочь другим понять проблему, в надежде найти решение, вы можете воссоздать это, пригласив друга на матч, но затем покинув матч во время первого хода, прежде чем вы отправите этот ход приглашенному игроку. Затем принимающий игрок удаляет матч из Game Center. На устройстве приглашенного игрока у него будет совпадение, похожее на указанное выше, которое нельзя удалить. Я пробовал все типы обходных решений.

Мне еще не повезло, но я обновлю свой ответ решением, если найду его. В настоящее время я пытаюсь выпустить игру Game Center, поэтому мне нужно найти способ обойти это. У меня будет заключение в ближайшие день или два.

ОБНОВЛЕНИЕ: я просмотрел свои неудаляемые матчи, и они почти такие же, как и у вас, за исключением того, что мой игрок со статусом «Приглашенный» также имеет результат матча «Выиграл». Кажется, что ключ к тому, чтобы перевести матч в недопустимое состояние, - это иметь статус одного игрока «Приглашен», а не «Готово», но статус матча «Завершен». Это общий элемент между двумя нашими случаями, и это пограничный случай в причудливом коде Apple Game Center. Меня не удивило бы, если бы они просто облажались в этом крайнем случае и ожидали, что вы «просто будете знать», что вы не должны помещать игроков в такое состояние (несомненно, если вы достаточно внимательно прочитаете их документы, вы сможете соберите это вместе в конце концов).

Я пришел к выводу, что у Apple есть пограничный случай, который легко остается незамеченным, потому что это может произойти, только если вы выйдете из нового матча, и только если вы пригласите друга, два случая, которые вы не часто тестируете. Кроме того, если вы не устанавливаете результаты матча неправильно, я предполагаю, что этого никогда не произойдет, поэтому они просто не поймали его.

Поскольку я еще не отгрузил, я собираюсь настроить свое приложение для обнаружения совпадений в этом состоянии и игнорировать их. Я собираюсь сообщить на консоль, сколько совпадений находится в этом состоянии, просто чтобы я мог убедиться, что оно не превысит эту точку. Затем я проанализирую свой код выхода и удостоверюсь, что в этом крайнем случае я просто больше никогда не смогу привести совпадение в это состояние. Я думаю, учитывая то, что мы знаем, мы должны действовать на опережение и просто смириться с тем фактом, что некоторые матчи не состоялись.

Надеюсь, вы еще не отправили игру, поэтому совпадения ошибок будут локализованы в среде Game Center Sandbox. На самом деле плохие совпадения просто локализуются для вашего тестового пользователя в песочнице, поэтому вы можете просто выбросить этого пользователя и начать с нового пользователя, как только вы исправите свою проблему. Если вы реализуете мои приведенные выше предложения, вы сможете убедиться, что ваше приложение работает правильно, прежде чем делать этот шаг.

Если кто-то действительно может найти способ удалить эти совпадения ошибок, если они существуют, сообщите нам об этом, но я надеюсь, что моих предложений и определения фактической причины будет достаточно, чтобы помочь вам продолжить работу над вашим проектом.

person Josh    schedule 16.03.2013
comment
Я смог удалить эти совпадения ошибок, установив participant.matchOutcome = GKTurnBasedMatchOutcomeTied для всех участников, а затем вызвав [match removeWithCompletionHandler...]. Это не то, что я буду хранить в своем коде, но оно убрало недопустимые игры. - person Jon; 16.07.2013

Я нашел решение. Для неверных совпадений просто используйте метод -participantQuitOutOfTurn, а затем метод -removeWithCompletionHandler. Он будет полностью удален.

person Salih Ozdemir    schedule 26.04.2013

У меня похожая ситуация, если немного другая. Я начинаю матч, приглашаю в игру вторую учетную запись песочницы, затем первый игрок выходит и удаляет игру до того, как второй игрок успевает ответить. Когда второй игрок пытается выйти из игры, он получает эту ошибку:

Error quitting match in turn: Error Domain=GKErrorDomain Code=22 "The requested operation could not be completed because the specified participant is invalid." 
UserInfo=0x1f5de800 {
    GKServerStatusCode=5097, 
    NSUnderlyingError=0x1f58b610 "The operation couldn’t be completed. 
    status = 5097, 
    Invalid state: turn sent to playerId:1952436619 in slotIndex: 0 for sessionId: 698b074b-fa0b-4505-834f-1b4305b7eecb : expected slot state: Active but found: Inactive", 
    NSLocalizedDescription=The requested operation could not be completed because the specified participant is invalid.
}

Насколько я могу судить, это происходит потому, что следующий участник, который переместится, уже имеет статус «Готово», что, как я предполагаю, связано с тем, что он уже вышел:

<GKTurnBasedMatch 0x1f532b20    id:698b074b-fa0b-4505-834f-1b4305b7eecb status:Open message: taken:2013-03-30 19:53:47 +0000 created:2013-03-30 18:29:09 +0000
current:<GKTurnBasedParticipant 0x1f532b80 - id:G:1952433332 (local player) status:Active outcome:None lastTurn:2013-03-30 19:53:47 +0000>
participants:
        <GKTurnBasedParticipant 0x1f532b70 - id:G:1952436619 status:Done outcome:Lost lastTurn:2013-03-30 18:29:10 +0000>
        <GKTurnBasedParticipant 0x1f532b80 - id:G:1952433332 (local player) status:Active outcome:None lastTurn:2013-03-30 19:53:47 +0000>
    >

Надеюсь, это поможет другим диагностировать, если ничего больше. Хотелось бы услышать мнение других об обходном пути или решении. Если это ошибка со стороны Apple, кажется, что стоит подать заявление.

person todd412    schedule 31.03.2013

Служба технической поддержки разработчиков Apple подтвердила проблему. Отправленный отчет об ошибке. Буду держать вас в курсе.

person Valentyn    schedule 10.04.2013
comment
Есть новости по этому поводу? Не могли бы вы скинуть ссылку, где отслеживается проблема. - person Drux; 27.08.2013