0

我正在尝试在我的 OSX 游戏中实现 GameKit。不幸的是,我找不到太多关于如何做到这一点的信息;所有教程似乎都是 iOS(尽管文档明确指出“Game Center 可在 iOS 和 OS X 上使用”)。

一切都编译正常;当我尝试对本地用户进行身份验证时出现问题:

    [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(id viewController, NSError *error) {
        if(error) {
          DLog(@"Error: %@",error);// This is always returning an error
        }
        else if(viewController) {
          // WHAT DO I DO HERE??
        }
      }];

我有两个问题:

首先,处理程序总是得到一个错误:Error Domain=GKErrorDomain Code=6 "The requested operation could not be completed because local player has not been authenticated." UserInfo=0x10103bc70 {NSLocalizedDescription=The requested operation could not be completed because local player has not been authenticated.}.

其次,我不知道如何呈现视图控制器。

在 iPhone 上,这段代码运行良好:没有错误,我只是展示了 viewController(它是登录屏幕)。

4

2 回答 2

1

很抱歉,我意识到我的答案迟了将近一年,但万一它可能仍然与像我一样仍在问这个问题的其他人有关。Ed Marty 大部分是正确的,但我发现对我有用的是这个。

[[GKLocalPlayer localPlayer] setAuthenticateHandler:^(NSViewController < GKViewController >  viewController, NSError *error) {

          if(error) {
             NSLog(@"Error: %@",error);
          }
          else if(viewController) {
            GKDialogController *presenter = [GKDialogController sharedDialogController];
            presenter.parentWindow = myWindow;
            [presenter presentViewController:viewController];
         }
}];

主要区别是使用符合 GKViewController 的 NSViewController 而不是 id。(另外,我使用 NSLog 而不是 DLog,但这不是太重要)。

“然而,我发现这完全没用,它甚至在调用处理程序之前就显示了登录对话框。”

为确保其正常运行,请通过您的应用设置一个新的 Game Center 帐户。当您运行程序并加载一个供您登录的窗口时,即使您已经拥有 Apple ID,也请按“创建新 Apple ID”。该按钮可能不起作用,因此,如果是这种情况,请打开 Game Center 并按“创建新 Apple ID”。无论哪种方式,您的目标都是创建一个“沙盒”游戏中心帐户,您可以在此处了解更多信息:https ://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/TestingYourGameCenter-AwareGame/ TestingYourGameCenter-AwareGame.html#//apple_ref/doc/uid/TP40008304-CH17-SW1

当您阅读条款和条件时,如果在左上角的黄色横幅上出现“沙盒”一词,您就可以判断该帐户是否已被沙盒。再次抱歉,我迟到了,但希望这能为所有未来的观众清除话题。

PS我很抱歉代码格式不正确。

于 2014-07-03T14:30:19.603 回答
0

我发现 OSX 的 GameKit 文档严重缺乏、误导,有时甚至是完全错误的。也就是说,根据这份文件,这就是你应该做的事情:

[[GKLocalPlayer localPlayer] setAuthenticateHandler:^(id viewController, NSError *error) {
    if(error) {
      DLog(@"Error: %@",error);// This is always returning an error
    }
    else if(viewController) {
      GKDialogController *presenter = [GKDialogController sharedDialogController];
      presenter.parentWindow = myWindow;
      [presenter presentViewController:viewController];
    }
  }];

然而,我发现这完全没用,它甚至在调用处理程序之前就显示了登录对话框。

于 2013-08-08T18:49:48.463 回答