Game Center Sandbox: problema de "No se pudo crear el juego"

Actualmente estoy desarrollando un juego basado en turnos que usa Game Center para manejar las funcionalidades en línea (para hacer coincidencias y manejar turnos).

Estoy usando dos counts de sandbox: una en mi 3gs y otra en el simulador ios. He estado probando mi aplicación con el GKTurnBasedMatchMakerViewController para hacer el partido durante un time sin ningún problema, pero ahora estoy estancado con un problema:

Cada vez que quiero invitar a otro jugador para uno nuevo (con uno u otro jugador), el GKTurnBasedMatchMakerViewController muestra un UIAlertView que indica:

No se pudo crear el juego: elimine un juego existente y vuelva a intentarlo.

El caso es que he eliminado todas las partidas para cada jugador (ninguna de ellas tiene ningún juego en su list (ni siquiera un juego cerrado). Por lo tanto, ninguno de los usuarios está en ningún partido en este momento.

En mi GKTurnBaseMatchMakerViewControllerDelegate, el turnBasedMatchmakerViewController: didFailWithError: no se llama. La única function llamada llamada en el delegado, cuando hago clic en el button Aceptar en UIAlertView, es turnBasedMatchmakerViewControllerWasCancelled:

Lo único que puedo pensar es que mis juegos en realidad no se eliminan de GameCenter, pero como los estoy eliminando con la interfaz de usuario GKMatchMakerViewController, apenas lo creo.


Al salir de una partida basada en turnos, he implementado turnBasedMatchmakerViewController: playerQuitForMatch: así:

- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController playerQuitForMatch:(GKTurnBasedMatch *)match { if ( [self isLocalPlayerCurrentPlayerForMatch:match] ) { NSData* endData = match.matchData; for (GKTurnBasedParticipant* participant in match.participants) { participant.matchOutcome = GKTurnBasedMatchOutcomeWon; } match.currentParticipant.matchOutcome = GKTurnBasedMatchOutcomeLost; [match endMatchInTurnWithMatchData:endData completionHandler:^(NSError *error) { if (error) { NSLog(@"%@",error.description); } }]; } } 

(Nota: solo tengo dos jugadores en el juego)

donde isLocalPlayerCurrentPlayerForMatch es:

 - (BOOL) isLocalPlayerCurrentPlayerForMatch:(GKTurnBasedMatch*)match { return [[[GKLocalPlayer localPlayer] playerID] isEqualToString:match.currentParticipant.playerID]; } 

¿Alguien ha encontrado y encontrado una solución a este problema? ¿Estoy haciendo algo mal aquí o es tan obvio que no puedo verlo?

Muchas gracias por cualquier comentario que me ayude a encontrar la raíz de ese problema.

Actualizar

Gracias a @ kaan-dedeoglu logré saber que ambos usuarios tenían una list vacía de coincidencias (consistente con el estado mostrado).

También creé una tercera count Sandbox. Nombrando las dos primeras counts A y B, C el tercero.

Estado 1:

  1. A y B no están vinculados a ninguna coincidencia.
  2. A y B obtienen el error "No se pudo crear el juego" mientras se creaba un juego (A invita B, A || B invita a otro jugador, A || B crea nuevo automatch).

Estado 2:

  1. C (count de trabajo) puede invitar a B y normalmente juega a una fiesta con B.
  2. C (trabajando) puede invitar a B a otra fiesta simultánea
  3. C (trabajando) invita a A a jugar.
  4. A no puede jugar (no puede acceder a la list de coincidencias actuales, el GKTurnBasedMatchMakerViewController va directamente a la creación de un nuevo juego).
  5. C ya no funciona.
  6. A, B y C ahora están atrapados en el error "No se pudo crear el juego".

Como complemento aquí es cómo inicializo mi GKTurnBasedMatchMakerViewController, pero no veo que eso sea incorrecto.

 - (void) displayMatchMakerVC { if (! [[GKLocalPlayer localPlayer] isAuthenticated] ) return; GKMatchRequest* request = [[[GKMatchRequest alloc] init] autorelease]; int nbPlayers = 2; request.minPlayers = nbPlayers; request.maxPlayers = nbPlayers; GKTurnBasedMatchmakerViewController* matchMakerVC = [[[GKTurnBasedMatchmakerViewController alloc] initWithMatchRequest:request] autorelease]; matchMakerVC.turnBasedMatchmakerDelegate = self; matchMakerVC.showExistingMatches = YES; [[CCDirector shanetworkingDirector] presentModalViewController:matchMakerVC animated:YES]; } 

NB: No estoy usando ARC, ¿podría estar relacionado con un problema de memory? No soy realmente un gurú de la gestión de la memory, pero parece correcto a mi entender.

¿Alguna idea de cómo esto podría estar relacionado con mi código y no con el centro de juegos? Muchas gracias por cualquier respuesta que pueda ayudarme a ir más allá.

Actualización 2: turnbasedMatchmakerViewController: didFindMatchMethod:

Aquí está mi turnbasedMatchmakerViewController: didFindMatchMethod: method.

 - (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController didFindMatch:(GKTurnBasedMatch *)match { BLTheme* theme = [[[BLGameConfig shanetworkingConfig] localPlayer] userTheme]; GameSceneRemoteGCLoader* loader = [[GameSceneRemoteGCLoader alloc] initWithGKMatch:match andTheme:theme]; [viewController dismissViewControllerAnimated:NO completion:^{}]; [[CCDirector shanetworkingDirector] replaceScene:loader]; } 

Cuando estoy iniciando un automatch, está ejecutando exactamente el mismo error "No se pudo crear el juego: elimine un juego existente y vuelva a intentarlo".

Esto puede o no ser la solución a su problema, pero tuve un problema similar y lo resolví de la siguiente manera.

Parece que, de forma pnetworkingeterminada o de alguna manera, Game Center trata las aplicaciones con CFBundleVersion diferentes de CFBundleVersion (número de compilation, no de versión o CFBundleShortVersionString ) como incompatibles entre sí, y por lo tanto no muestra coincidencias entre aplicaciones con numbers de compilation incrementados. (A menudo, los desarrolladores incrementan este número a medida que se distribuyen nuevas versiones ad hoc o versiones estables durante el desarrollo, por lo que es bastante lamentable).

Para encontrar y eliminar los juegos "perdidos", CFBundleVersion mi valor CFBundleVersion (que reveló los juegos), y luego eliminé las coincidencias ofensivas.

Como alternativa, ajustar algunas configuraciones en iTunes Connect parece haber eliminado esta incompatibilidad CFBundleVersion . Se tarda un time en propagarse, pero creo que fue lo que tocó en mi aplicación, tocando en Ver detalles, asegurándose de que el conmutador Game Center está configurado en "Habilitado", y asegurándose de que haya un elemento en la "Compatibilidad multijugador" table. También podría jugar con las posibilidades dentro del button "Administrar Game Center" desde la pantalla de la aplicación original, pero creo que la configuration de "Compatibilidad multijugador" es lo que finalmente me permitió ver todas las coincidencias "antiguas" que estaban ocultas previamente.

¡Buena suerte!

Solo para asegurarse: en ambos dispositivos, agregue estas líneas en su controller de finalización de authentication y ejecútelo una vez. (entonces puedes comentarlo).

 [GKTurnBasedMatch loadMatchesWithCompletionHandler:(^)(NSArray *matches, NSError *error) { for (GKTurnbasedMatch *match in matches) { [match removeWithCompletionHandler:NULL]; } }]; 

Esto asegurará que todos los juegos se eliminen de su playerID.

Es ridículo . No es necesario eliminar una coincidencia existente para crear una nueva coincidencia. Estoy desarrollando un juego como este y realmente funciona.

Lo siguiente me funcionó. Primero ejecuté la aplicación en el dispositivo para cada jugador, llamando a quitAllMatches. Luego volví a ejecutar la aplicación en cada dispositivo, llamando a removeAllMatches.

A la larga, tiene que ser mejor para limpiarlos a medida que avanzas. Pero esto resolvió el problema inmediato.

 -(void) quitAllMatches { [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error) { for (GKTurnBasedMatch* match in matches) { GKTurnBasedParticipant* participant = match.currentParticipant; NSString* playerID = participant.playerID; NSString* localPlayerID = [GKLocalPlayer localPlayer].playerID; if ([playerID isEqualToString: localPlayerID]) { NSArray* participants = match.participants; for (GKTurnBasedParticipant* participant in participants) { participant.matchOutcome = GKTurnBasedMatchOutcomeTied; } NSData* data = [NSData data]; [match endMatchInTurnWithMatchData: data completionHandler:^(NSError* error) { if (error) { WJLog(@"did not end -- error %@", [error localizedDescription]); } else { WJLog(@"match ended!"); } }]; } } }]; } -(void) removeAllMatches { [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error) { for (GKTurnBasedMatch* match in matches) { [match removeWithCompletionHandler:^(NSError* error) { if (error) { WJLog(@"error: %@", [error localizedDescription]); } else { WJLog(@"removed match"); } }]; } }]; }