iOS6上GKLocalPlayer身份验证崩溃,模式转换错误

iOS6上GKLocalPlayer身份验证崩溃,模式转换错误,ios,ios6,game-center,Ios,Ios6,Game Center,我的应用程序记录是否已成功通过Game Center的身份验证。当它启动一个新游戏或者当用户查看分数列表时,如果本地播放器还没有被成功地验证,并且如果应用程序不在试图验证用户的时间内,则它再次尝试。p> (为什么?如果您从无网络区域移动到网络区域。) 不幸的是,在iOS6/XCode 4.5下,它开始崩溃。或者至少在某些有限的情况下是这样的:当用户无法使用错误的密码和/或不存在的帐户登录时。成功登录后,一切正常 登录失败后,当我去做一些导致重新授权检查发生的事情时,我得到以下信息: 2012-0

我的应用程序记录是否已成功通过Game Center的身份验证。当它启动一个新游戏或者当用户查看分数列表时,如果本地播放器还没有被成功地验证,并且如果应用程序不在试图验证用户的时间内,则它再次尝试。p> (为什么?如果您从无网络区域移动到网络区域。)

不幸的是,在iOS6/XCode 4.5下,它开始崩溃。或者至少在某些有限的情况下是这样的:当用户无法使用错误的密码和/或不存在的帐户登录时。成功登录后,一切正常

登录失败后,当我去做一些导致重新授权检查发生的事情时,我得到以下信息:

2012-09-25 15:54:47.829应用程序名称[1493:907]* -[UIWindowController]中的断言失败 转换:从ViewController:到ViewController:目标:DiEndSelector:], /SourceCache/UIKit/UIKit-2372/UIWindowController.m:211

然后这实际上崩溃了:

2012-09-25 15:55:25.569应用程序名称[1493:907]* 由于未捕获异常而终止应用程序 “NSInternalInconsistencyException”,原因:“正在尝试开始 从到的模态转换 而过渡是 已经在进行中。等待查看显示/查看消失以了解 当前转换已完成' *第一次抛出调用堆栈:(0x394932a3 0x31db297f 0x3949315d 0x383fd2af 0x3640377b 0x36402fcf 0x394969c4 0x393edfeb 0x36521733 0x32a83d2d 0x3264B1F 0x3264a4b7 0x3264f1bd 0x39466f3b 0x393d9ebd 0x393d9d49 0x353132eb 0x3636b301 0x7e863 0x7e808)libc++abi.dylib: 终止引发异常的调用

这是一个麻烦的代码:

-(void)authenticateLocalUser {

    if (!self.checkingLocalPlayer) {
        self.checkingLocalPlayer = YES;
        GKLocalPlayer *thisPlayer = [GKLocalPlayer localPlayer];

        if (!thisPlayer.authenticated) {

            [[GKLocalPlayer localPlayer]
             authenticateWithCompletionHandler:^(NSError *error)
             {
                 [self finishGameCenterAuthWithError:error];
             }
             ];
        }
    }
}

知道我做错了什么吗?

Ggrrrhhh相同的问题,我想我找到了它…ios6不赞成authenticateWithCompletionHandler请参阅链接,建议您使用AuthenticateHandler

这似乎有效

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {

//[localPlayer authenticateWithCompletionHandler:^(NSError *error) { OLD CODE!
    if (localPlayer.isAuthenticated)
    {
        //do some stuff
    }
    else {

        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"NOT AUTHORISED"
                                  message:@"YOUR'RE NOT LOGGED INTO GC."
                                  delegate:self
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];

    }
})];

Jamie West正确地指出,问题在于在iOS6中切换到authenticateHandler,这似乎导致authenticateWithCompletionHandler:被破坏。由于它已经被弃用,苹果不太可能修复他们的错误

这是我需要的一切。请注意检查iOS5版本的条件(支持5和6)以及在发送视图控制器时调用视图控制器的需要(例如,authenticateHandler:不是authenticateWithCompletionHandler的直接替代品:-您必须做一些额外的工作)

presentViewController:函数只需从我的top view controller调用新的view controller(我必须在我的程序中手动找出它才能使所有这些工作正常):

不幸的是,从iOS6开始,如果用户在当前会话中已被取消,GameCenter似乎不会尝试重新授权用户,因此至少我在适当的时候重新授权的一些要点已经消失了。但是,它仍然存在于iOS5中(可能还有取消之外的其他情况?)


当应用程序从睡眠中被调用时,如果用户去做了其他事情,它将尝试重新授权。

我遇到了完全相同的问题和类似的崩溃消息,上面的回答没有解决问题

2012-09-25 15:55:25.569 APP NAME [1493:907] * Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from
<GKModalRootViewController: 0x1cd8b2a0> to <GKHostedAuthenticateViewController: 0x1e31a350>
 while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know
the current transition has completed' 

这确实是问题所在。作为另一个答案,我在附近有一些额外的评论。是的,谢谢你在ios 6上构建vs other。我还相信presentModalViewController也在ios 6的印章列表中。您是否有理由检查ios版本,而不仅仅是检查
setAuthenticateHandler:
方法是否可用?我想知道这是否只是在iOS<6中没有记录……除非绝对必要,否则苹果强烈建议检查选择器和类的可用性,而不是检查特定的iOS版本。如果您想提醒您按要求发布代码的原因,您可以随时在代码中添加注释。
-(void)presentViewController:(UIViewController *)thisVC {

    [myTopVC presentModalViewController:thisVC animated:YES];

}
2012-09-25 15:55:25.569 APP NAME [1493:907] * Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from
<GKModalRootViewController: 0x1cd8b2a0> to <GKHostedAuthenticateViewController: 0x1e31a350>
 while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know
the current transition has completed' 
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    //Setup Game Center Manager
    if ([GameCenterManager isGameCenterAvailable]) {  
        delegate.gameCenterManager = [[GameCenterManager alloc] init];
        [delegate.gameCenterManager setDelegate:delegate];
        [delegate.gameCenterManager authenticateLocalUser];
    } else {
        // The current device does not support Game Center.
    }

    //... more things if you have
}