iOS 6 Game Center authenticateHandler取消后无法登录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 6 Game Center authenticateHandler取消后无法登录相关的知识,希望对你有一定的参考价值。
[在ios 6中使用authenticateHandler时,如果用户取消登录视图,游戏中心将不会显示登录视图。我知道游戏中心将在3次取消尝试后自动锁定应用程序,但我所说的只是2次尝试。如果他们取消了登录名,则必须离开应用程序,然后再返回游戏中心,即使通过authenticateHandler重新设置登录名也将显示登录名。关于如何在iOS 6中处理这种情况的任何想法?
当使用较旧的authenticateWithCompletionHandler方法时,它工作正常:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0
GKLocalPlayer.localPlayer.authenticateHandler = authenticateLocalPlayerCompleteExtended;
#else
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:authenticateLocalPlayerComplete];
#endif
这对我的应用很重要的原因是它需要Game Center才能支持多人游戏。该应用会在启动时尝试向游戏中心进行身份验证,但是如果用户取消,我们不会在启动时再次询问他们,因此不会让他们陷入困境。如果他们选择多人游戏时未登录,则我们将显示一个“游戏中心登录”按钮。登录按钮通过调用authenticateWithCompletionHandler(现在通过再次设置GKLocalPlayer.localPlayer.authenticateHandler)来强制游戏中心登录。
最好使用运行时检查(instancesRespondToSelector :)而不是预处理程序#if语句,以便您可以使用建议的方法(在可用的情况下,并在其他地方使用不建议使用的方法)。我实际上发现我需要在设置邀请处理程序之前区分三种情况,因为身份验证处理程序也可能会使用nil视图控制器进行调用:
-(void)authenticateLocalPlayer
{
if ([[GKLocalPlayer class] instancesRespondToSelector:@selector(setAuthenticateHandler:)]) {
[[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *gameCenterLoginViewController, NSError *error) {
if (gameCenterLoginViewController) {
[self.presentedViewController presentViewController:gameCenterLoginViewController
animated:YES
completion:^{
[self setInviteHandlerIfAuthenticated];
}];
} else {
[self setInviteHandlerIfAuthenticated];
}
}];
} else { // alternative for iOS < 6
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
[self setInviteHandlerIfAuthenticated];
}];
}
}
还必须在邀请处理程序中区分更多情况,因为matchForInvite ::也是iOS6中的新功能,并且避免了游戏中心视图控制器的另一轮回合:
-(void)setInviteHandlerIfAuthenticated
{
if ([GKLocalPlayer localPlayer].isAuthenticated) {
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
if (acceptedInvite) {
if ([GKMatchmaker instancesRespondToSelector:@selector(matchForInvite:completionHandler:)]) {
[self showInfoAnimating:YES completion:NULL];
[[GKMatchmaker sharedMatchmaker] matchForInvite:acceptedInvite
completionHandler:^(GKMatch *match, NSError *error) {
// ... handle invited match
}];
} else {
// alternative for iOS < 6
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease];
mmvc.matchmakerDelegate = self;
// ... present mmvc appropriately
// ... handle invited match found in delegate method matchmakerViewController:didFindMatch:
}
} else if (playersToInvite) {
// ... handle match initiated through game center
}
};
}
}
让我知道是否有帮助。
我不认为这在iOS 6.0中是可能的。早期的SDK版本在发布之前就已删除了API调用。
在WWDC 2012视频:Session 516-将游戏与Game Center集成[8:30]他们实际上在您调用authenticate
方法的地方显示代码:
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticationHandler = //handle the callback...
[localPlayer authenticate];
此方法现在是私有API,但您可以通过调用以下方法查看它的作用:
[[GKLocalPlayer localPlayer] performSelector:@selector(_authenticate)];
它确实满足您的要求,但由于它是私有的,因此无法使用。
您还可以通过发布UIApplicationWillEnterForegroundNotification
通知来触发身份验证过程:
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]];
我认为不建议在实时代码中这样做。
我不知道Game Center拥有这样的网站
以上是关于iOS 6 Game Center authenticateHandler取消后无法登录的主要内容,如果未能解决你的问题,请参考以下文章
iOS 6 Game Center authenticateHandler取消后无法登录
iOS 6 Game Center authenticateHandler 取消后无法登录