Game Center Encontrando uma Partida Programaticamente

Eu simplesmente não consigo descobrir como isso funciona. O que estou tentando fazer é permitir que dois jogadores joguem um jogo, se um terceiro jogador se juntar a ele, pode entrar instantaneamente no jogo, se o quarto e último jogador se juntar a ele, também poderá entrar instantaneamente no jogo. Eles também podem sair do jogo a qualquer momento, por qualquer motivo, se isso acontecer, deve haver um espaço aberto para outra pessoa ou para a mesma pessoa se reconectar. Essa é a ideia.

Agora o que eu tenho é o seguinte. Eu autentico o player local por razões óbvias. Então eu procuro uma correspondência como esta:

if (matchRequest) [matchRequest release];
matchRequest            = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
    if (error) {
        // An error occured
    } else {
        if (matchCurrent) [matchCurrent release];
        matchCurrent          = [match retain];
        matchCurrent.delegate = self;
    }
}];

Se eu executar esta parte em três dispositivos diferentes, dois deles se encontrarão e o terceiro ainda está procurando. Então, percebi que após a busca por solicitação encontrar a quantidade mínima de jogadores que será executada uma vez. Então, o que eu precisava era de um método que usasse o matchCurrent que eu mantinha para adicionar mais jogadores. Felizmente esse método existia, mas como isso funcionaria? Quando você chama neste caso? Decidi colocá-lo sob um botão para que eu pudesse executá-lo manualmente quando uma correspondência fosse encontrada.

O que descobri é que, quando o pressionei no primeiro dispositivo, finalmente o terceiro dispositivo conseguiu encontrar a correspondência entre o primeiro e o segundo dispositivo. Na verdade, o segundo e o terceiro dispositivo continham os IDs de todos os dispositivos envolvidos. O que é uma boa coisa. Mas existem dois problemas.

Qual dispositivo realmente deve chamar o método addPlayersToMatch? E como você pode restringi-lo a um dispositivo executando esse método? Além disso, quando você deve ligar?

Por que, no dispositivo que chama esse método, os IDs do jogador não são atualizados?

[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
    //matchCurrent.playerIDs is not updated?!
}]; 

Na verdade eles são atualizados. Quando vejo os IDs do jogador aparecerem no segundo e terceiro dispositivo, atualizo manualmente os matchCurrent.playerIDs no dispositivo um e, de repente, ele reconhece o player. No entanto, mesmo o 'didChangeState' do player não é chamado quando o novo player é descoberto no dispositivo um.

questionAnswers(3)

yourAnswerToTheQuestion