非推奨のメソッドを使用せずに行ったことは次のとおりです。
以下の関数を呼び出して、認証ハンドラーを AppDelegate ですぐに設定します (私はそれをシングルトン ヘルパー オブジェクトに入れました)。現時点では、ログイン ビュー コントローラを表示するためのビュー コントローラがないため、認証が失敗し、ハンドラーがビュー コントローラを提供した場合は、それを保存してください。これは、ユーザーがログインしていない場合です。
- (void)authenticateLocalUserNoViewController {
NSLog(@"Trying to authenticate local user . . .");
GKLocalPlayer *_localPlayer = [GKLocalPlayer localPlayer];
__weak GKLocalPlayer *localPlayer = _localPlayer; // Avoid retain cycle inside block
__weak GCHelper *weakself = self;
self.authenticationViewController = nil;
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error)
{
if (viewController) {
NSLog(@"User not logged in");
weakself.authenticationViewController = viewController; // save it away
} else if (localPlayer.authenticated) {
[[GKLocalPlayer localPlayer] unregisterListener:self];
[[GKLocalPlayer localPlayer] registerListener:self];
NSLog(@"Local player %@ (%@) authenticated. ID = %@",localPlayer.alias, localPlayer.displayName, localPlayer.playerID);
} else {
// Probably user cancelled the login dialog
NSLog(@"Problem authenticating %@", [error localizedDescription]);
}
};
}
次に、メイン画面が読み込まれ、ユーザーがボタンを押してオンライン ゲームを開始したくなったら、先ほど隠しておいたログイン ビュー コントローラーを提示します。これをヘルパークラスの別のメソッドに入れました。ユーザーがログインすると、元の認証ブロックの実行がトリガーされますが、viewcontroller パラメーターは nil になります。
-(BOOL) showGameCenterLoginController:(UIViewController *)presentingViewController {
if (self.authenticationViewController) {
[presentingViewController presentViewController:self.authenticationViewController animated:YES completion:^{
}];
return YES;
} else {
NSLog(@"Can't show game center view controller!");
return NO; // Show some other error dialog like "Game Center not available"
}
}