Существует официальный баг в Game Center API, когда из списка не удаляется GKTurnBasedMatch. Баг достаточно распространенный, он происходит главным образом тогда, когда активный участник покидает игру (вызов participantQuitInTurnWithOutcome:…) и удаляет ее из своего списка матчей. Игра получает какое-то неверное состояние, после чего остальные игроки не могут ее удалить из списка. Причем не могут как из интерфейса матч-мэйкера, так и вызовом removeWithCompletionHandler:… Возвращается ошибка номер 17 (Error=17) о том, что какие-то параметры заданы неверно. При этом сам матч может иметь уже статус завершенного GKTurnBasedMatchStatusEnded!
Как я уже отметил, Apple призналась в баге, но не исправила до сих пор.
Баг замечен, например, в игре Ой Ё. Об этом было сказано в их блоге. Мы тоже достаточно быстро столкнулись с этой проблемой, и она висела нерешенной почти два месяца. Тут, наконец-то, изучая многочисленные форумы мне удалось найти решение.
Суть в том, чтобы несмотря на завершенность матча попытаться (в случае возникновения ошибки) завершить свой ход, передав его любому другому участнику, затем выйти из игры ВНЕ хода и снова отправить запрос на завершения матча. Этот workaround помог мне со всеми неудаляемыми играми!
Вот код:
- (void) removeGameFromGC
{
[_match removeWithCompletionHandler:
^(NSError *error) {
if(!error)
{
DLog(@"match removed!");
}
else
{
[self reportError:error];
GKTurnBasedParticipant *nextParticipant = nil;
for (GKTurnBasedParticipant *participant in _match.participants)
{
participant.matchOutcome = GKTurnBasedMatchOutcomeTied;
if(![TurnBasedHelper isHeLocal:participant.playerID])
nextParticipant = participant;
}
[_match endTurnWithNextParticipants:@[nextParticipant]
turnTimeout:GKTurnTimeoutDefault
matchData:nil
completionHandler:
^(NSError *error)
{
if (error)
{
[self reportError:error];
}
[_match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
withCompletionHandler:
^(NSError *error)
{
if (error)
{
[self reportError:error];
}
[_match removeWithCompletionHandler:^(NSError *error)
{
if (error)
{
[self reportError:error];
}
}];
}];
}];
}
}];
}