2012-09-13 5 views

答えて

17

setAuthenticateHandlerは、iOS 6で、authenticateWithCompletionHandlerはまだ下記のiOS 5とで使用されなければならない新しいものです。

また、presentViewController:animated:completion:の完了ハンドラを提供することは、完了時ではなく、ゲームセンタービューが表示された直後に完了ハンドラが呼び出されるため、実際には必要ありません。ではない実際のデバイス上で - - 6.0シミュレータのみのiOS 4.3、iOSの5.1、iOSの上でテスト

は、ここに私のソリューションです。

- これはGameCenter APIが利用可能であることを確認したことを前提としています。

- (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

うまく機能します!あなたはどうしたら廃止されたメソッドの警告フラグを取り除きますか? – msgambel

+0

デプロイメントターゲットをたとえばに設定します。 5.0またはあなたのターゲットが何であれ - プロジェクト(プロジェクトナビゲータの一番上の行)を選択し、ターゲット>概要>デプロイメントターゲットでアプリを選択します。 –

3

これは私が思いついたものです。これはうまくいくようです。私が何かを見逃したと思ったら、編集してください。

-(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

私はこのコードをiOS 6以上で使用しています。コンパイラのエラーはなく、正常に動作しているようです。

#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 
{ 

}