2012-09-13 22 views

Respuesta

17

setAuthenticateHandler es nuevo en IOS 6, authenticateWithCompletionHandler todavía debe ser utilizado en IOS 5 y por debajo.

Además, proporcionar un controlador de finalización para presentViewController: animado: finalización: no es realmente necesario ya que el controlador de finalización se llama justo después de que se muestra la vista del centro de juego, no cuando se completa.

aquí está mi solución:

NOTA - probado en iOS 4.3, iOS 5.1, iOS 6.0 simuladores solamente - no en el dispositivo real.

NOTA - esto supone que ha comprobado que la API de GameCenter está disponible.

- (void)checkLocalPlayer 
{ 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

    if (localPlayer.isAuthenticated) 
    { 
     /* Perform additional tasks for the authenticated player here */ 
    } 
    else 
    { 
     /* Perform additional tasks for the non-authenticated player here */ 
    } 
} 

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] \ 
compare:v options:NSNumericSearch] == NSOrderedAscending) 

- (void)authenticateLocalPlayer 
{ 
     GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

     if (SYSTEM_VERSION_LESS_THAN(@"6.0")) 
     { 
      // ios 5.x and below 
      [localPlayer authenticateWithCompletionHandler:^(NSError *error) 
      { 
       [self checkLocalPlayer]; 
      }]; 
     } 
     else 
     { 
      // ios 6.0 and above 
      [localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 
       if (!error && viewcontroller) 
       { 
        [[AppDelegate sharedDelegate].viewController 
        presentViewController:viewcontroller animated:YES completion:nil]; 
       } 
       else 
       { 
        [self checkLocalPlayer]; 
       } 
      })]; 
     } 
    } 
} 
+0

¡Funciona bien! Sin embargo, ¿cómo se deshace del indicador de advertencia del método obsoleto? – msgambel

+0

Simplemente configure el objetivo de despliegue en, p. Ej. 5.0 o cualquiera que sea su objetivo: seleccione el proyecto (fila superior en el navegador del proyecto)> seleccione su aplicación en Destinos> Resumen> Destino de despliegue. –

3

Esto es lo que se me ocurrió, parece que funciona. Siéntete libre de editar si crees que me he perdido algo.

-(void)authenticatePlayer { 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    [localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 
     if (!error) { 
      [self presentViewController:viewcontroller animated:YES completion:^{ 
       if (localPlayer.isAuthenticated) 
       { 
        // your code if authenticated 
       } 
       else { 
        // your code if not authenticated 
       } 
      }]; 
     } 
     else { 
      // error handling code here 
     } 
    })]; 
} 
5

Estoy usando este código para iOS 6 y superior. No hay errores de compilación y parece funcionar bien.

#pragma 
#pragma mark - Player Authentication 
-(void)autheticatePlayer 
{ 
    __weak typeof(self) weakSelf = self; // removes retain cycle error 

    _localPlayer = [GKLocalPlayer localPlayer]; // localPlayer is the public GKLocalPlayer 
    __weak GKLocalPlayer *weakPlayer = _localPlayer; // removes retain cycle error 

    weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) 
    { 
     if (viewController != nil) 
     { 
      [weakSelf showAuthenticationDialogWhenReasonable:viewController]; 
      } 
      else if (weakPlayer.isAuthenticated) 
      { 
       [weakSelf authenticatedPlayer:weakPlayer]; 
      } 
      else 
      { 
       [weakSelf disableGameCenter]; 
      } 
      }; 
} 

-(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller 
{ 
    [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil]; 
} 

-(void)authenticatedPlayer:(GKLocalPlayer *)player 
{ 
    player = _localPlayer; 
} 

-(void)disableGameCenter 
{ 

}