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 出现问题

iOS 6 Game Center 在身份验证时崩溃

iOS 6 Game Center authenticateHandler取消后无法登录

iOS 6 Game Center authenticateHandler 取消后无法登录

iOS 6 Game Center 在横向模式 cocos2d 中的身份验证崩溃

处理 Game Center 身份验证