1

我正在开发我的应用程序的新版本。我正常使用沙盒有一段时间了,但现在我所有的设备都遇到了一个非常奇怪的问题。他们似乎已半登录到游戏中心。这对他们不起作用,但他们也无法注销。这是我的身份验证方法:

- (void)authenticateLocalPlayer {
    GKLocalPlayer* localPlayer = WJLocalPlayer;
    WJLog(@"Authenticating local user...");
    if (localPlayer.authenticated == NO) {
        localPlayer.authenticateHandler = ^ (UIViewController* vc, NSError *error) {
            if (error) {
                WJLog(@"Authentication failed! %@", [error localizedDescription]);
            }
            else {
                WJLog(@"Authentication succeeded!");
                NSString* name = [GKLocalPlayer localPlayer].displayName;
                WJLog(@"display name is %@", name);
                NSString* alias = [GKLocalPlayer localPlayer].alias;
                WJLog(@"alias is %@", alias);
                GKTurnBasedEventHandler *ev = [GKTurnBasedEventHandler sharedTurnBasedEventHandler];
                ev.delegate = self;
            }
        };
    }
}

这是我从日志语句中看到的 [WJLog 只是我自己的 NSLog 版本,没有垃圾]:

Authenticating local user...
Authentication succeeded!
display name is Me
alias is (null)

我可以在游戏中心应用程序中登录或退出。没什么区别。我总是看到上面的。我什至尝试将其中一台设备恢复为出厂设置。结果还是一样。我还尝试为我的应用程序的新版本禁用和重新启用游戏中心。结果还是一样。

有任何想法吗?

4

1 回答 1

3

您完全忽略了 UIViewController 参数。如果它存在,您应该将其呈现给用户,以便他们可以登录。可能您现在才遇到这种情况,因为您登录到非沙盒游戏中心,现在当您运行它想要询问的应用程序时您的沙盒凭据,但您假设您已通过身份验证。

您这里还有一些其他问题:

  • 您应该只设置一次 authenticateHandler,在您的应用启动后不久。

  • 您应该在您的 authenticateHandler 中检查 localPlayer.authenticated,而不是其他任何地方,因为这是唯一保证它有效的地方。具体来说,在您从后台恢复之后,直到您的 authenticateHandler 再次被调用,这是一个毫无意义的值。如果您在其他地方需要它,请使用在启动时以及在您的 applicationWillEnterForeground 方法中初始化为 false 的全局变量,并且只有在您确定 localPlayer 实际经过身份验证时才在您的 authenticateHandler 中设置为 true。

  • 检查错误并通过各种方式记录它,但它不会告诉您任何关于身份验证是否真正成功的信息,因此请删除“else”。

看看这里的文档。

于 2013-03-07T05:11:07.317 回答