2

我正在尝试使用以下代码对本地播放器进行身份验证:

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块中返回的控制器总是为零。因此玩家中心似乎总是被禁用。

4

2 回答 2

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属性的 getter 时出错GKPlayer:属性名称是authenticated,但 getter 必须是isAuthenticated

找出这些语义拼写错误可能很简单,而编译器不会警告您,因为它可能是使用点符号访问的简单属性背后的更多代码,默认情况下,setter 以is.

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

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

于 2015-05-26T12:15:50.987 回答
0

问题是由于authenticateHandler被设置了两次造成的。该处理程序应在应用程序的生命周期内设置一次。第一次之后设置的后续authenticateHandler属性将产生意想不到的结果,就像我在问题中描述的问题一样。

于 2013-08-26T01:42:26.713 回答