目前GameCenter的用户验证在6.0之前和之后有不同,两种方式都有弹出GameCenter的登陆验证界面,6.0以前的没什么特别的,调用GKLocalPlayer的authenticateWithCompletionHandler就会弹出对应的登陆窗口。而6.0以后的登陆是将一个块函数传给authenticateHandler,之后块函数会被自动调用,没登陆的时候块函数返回的UIViewController就对应GameCenter的登陆界面。
如何让块函数中返回的viewController在我们的游戏中显示呢?
UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview:[viewController view]];
通过以上两句简单的代码就可以显示上述的viewController,但是这边会有一个问题,通过这种方式显示出来的GameCenter登陆界面能显示,也能登陆成功,但是当登陆成功的时候登陆界面并不会自动关闭,同时左上角的取消按钮也不能点击,无法退出登陆界面,只能在登陆界面上登陆操作。
如何才能让viewController在登陆成功以后自动关闭呢?
currentGameCenterController = [[UIViewController alloc] init];
UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview:[currentGameCenterController view]];
if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0) {
[currentGameCenterController presentModalViewController:viewController animated:YES];
} else {
[currentGameCenterController presentViewController:viewController animated: YES completion:nil];
}
其实就是在上述的viewController外再套一层UIViewController, 然后通过这个外层的UIViewController控制viewController的显示。这时候当登陆成功以后,登陆界面就会自动关闭了,同时应该还伴随这“welcome back”的提示信息。但是这变化还会有一个问题,登陆成功关闭的是viewController,我们自己创建的UIViewController还在,所以当登陆界面关闭以后虽然是回到了游戏界面,但是应该是无法操作的。
如何关闭上述我们自己创建的UIViewController呢?
GameCenter的authenticateHandler应该是状态监听,当登陆状态变化的时候传给authenticateHandler的块函数又会被调用到,而这次调用返回的是当前用户登陆成功,关闭我们自己创建的UIViewController就可以在这时候做。
if([GKLocalPlayer localPlayer].isAuthenticated)
{
if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0) {
[currentGameCenterController dismissModalViewControllerAnimated:NO];
} else {
[currentGameCenterController dismissViewControllerAnimated:NO completion:nil];
}
[currentGameCenterController.view removeFromSuperview];
[currentGameCenterController release];
currentGameCenterController = nil;
}
说明: currentGameCenterController是类的一个成员变量。