这是我在不必使用不推荐使用的方法的情况下所做的:
通过调用下面的函数立即在 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"
}
}