我正在尝试使用以下代码验证本地播放器:
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
块中返回的控制器总是为零。因此,游戏中心似乎总是被禁用。
答案 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>
顺便说一下,我可以使用工作示例教程添加一个知名教程的链接:
答案 1 :(得分:0)
问题是由authenticateHandler
设置两次引起的。处理程序应在应用程序生命周期的持续时间内设置一次。第一次设置后续authenticateHandler
属性将产生意外结果,如我在问题中描述的问题。