游戏中心验证本地播放器

时间:2013-08-25 18:36:12

标签: ios objective-c game-center

我正在尝试使用以下代码验证本地播放器:

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if(!localPlayer.authenticated) {
    localPlayer.authenticateHandler = ^(UIViewController* controller, NSError *error) {
        if(controller != nil)
            [self presentModalViewController:controller animated:YES];
    };
}

但问题是即使[GKLocalPlayer localPlayer].authenticated为假,authenticationHandler块中返回的控制器总是为零。因此,游戏中心似乎总是被禁用。

2 个答案:

答案 0 :(得分:1)

我发现这个身份验证代码在iOS 8中运行良好。

- (void)authenticateLocalPlayer
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    if (localPlayer.isAuthenticated) {
        [[NSNotificationCenter defaultCenter] postNotificationName:LocalPlayerIsAuthenticated object:nil];
        return;
    }

    localPlayer.authenticateHandler  =
^(UIViewController *viewController, NSError *error) {
        [self setLastError:error];

        if(viewController != nil){
            [self setAuthenticationViewController:viewController];
        } else if([GKLocalPlayer localPlayer].isAuthenticated) {
            NSLog(@"connected to gk");
            _GKConnected = YES;
            [[NSNotificationCenter defaultCenter] postNotificationName:LocalPlayerIsAuthenticated object:nil];
        }
        else {
            _GKConnected = NO;
        }
    };

    // REGISTER LISTENER FOR INVITES
    [localPlayer registerListener:self];
}

通知字符串可以是任何常量字符串(最好将反向DNS作为前缀用于NotificationCenter org.myapp.notificationname)。

在原始OP问题中,在authenticated实例中检索GKPlayer属性的getter时出错:属性名称为authenticated,但getter必须为isAuthenticated }。

可以轻而易举地找出那些语义拼写错误,而编译器并不会警告你,因为它可能是用点表示法访问的简单属性背后的更多代码,默认情况下,设置者以is开头。< / p>

顺便说一下,我可以使用工作示例教程添加一个知名教程的链接:

http://www.raywenderlich.com/60998/game-center-tutorial-how-to-make-a-simple-multiplayer-game-with-sprite-kit-part-2

答案 1 :(得分:0)

问题是由authenticateHandler设置两次引起的。处理程序应在应用程序生命周期的持续时间内设置一次。第一次设置后续authenticateHandler属性将产生意外结果,如我在问题中描述的问题。