GameCenter登录提醒

时间:2010-11-30 18:27:03

标签: iphone gamekit game-center

在我使用GameCenter开发的游戏中,我想处理以下场景:

  1. 用户启动游戏。系统会显示系统警报,提示他登录GameCenter。他暂时忽略了它。
  2. 过了一会儿,用户想要登录GameCenter并点击(例如)Leaderboards菜单项。他现在选择取消而不是登录。
  3. 该过程重复几次。最终用户想要登录GameCenter。他再次单击Leaderboard菜单项。
  4. 在我的测试中,我发现通过调用“authenticateWithCompletionHandler”(由Apple的示例GameCenterManager调用)引发的警报弹出窗口建议登录到GameCenter只出现有限次数(4或5)。最后一次显示,它显示“Game Center Disabled,登录Game Center应用程序启用”Afterwards“。之后,调用authenticateWithCompletionHandler不再显示任何内容 - 根本没有提示。

    播放FruitNinja我试图复制这个。但是,在他们的情况下,每次我点击GameCenter项目(例如,成就)时,会出现“禁止游戏中心”的弹出窗口。

    我想要做的是复制功能:也就是说,如果您没有登录到GameCenter,只要您点击Leaderboard菜单项就会出现标准游戏中心警报。

    有没有办法了解标准的“登录游戏中心”警报是否已经出现,或者强制它始终出现(而不仅仅是前几次尝试)?

7 个答案:

答案 0 :(得分:8)

这是一个解决此问题的想法:

无论“GC authenticateWithCompletionHandler” - 请求是否被取消

  • 用户在对话框中点击“取消”

或由于事实

  • 在设备上禁用GC(在用户完全取消警报对话框3次后发生(至少在iOS 5中))

您将始终收到一个NSError,代码为2,“请求的操作已被取消。”。

我能找到的唯一区别是authenticateWithCompletionHandler-Request和completion-Handler的执行之间传递的时间。

因此,在发送请求时,我节省了时间:

requestTime = [NSDate date]; 

并在我的完成处理程序中测量已失效的时间:

NSDate* now = [NSDate date];
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime];
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest);

如果用户取消了请求,则与GC取消操作所经过的时间相比,通过的时间将显着延长。在我的测试中,用户至少花了一秒钟取消对话,而GC取消的请求花了不到0.1秒(在我的iPhone 4上)

当然,这些值可能会因代码运行的设备以及处理器目前忙于处理的其他内容而有所不同。我已经检查过的一个问题是应用程序启动:如果你在Apple建议的applicationDidFinishLaunching期间发送authenticationRequest,那么在我的情况下GC需要更长的时间才能取消请求,因为设备正在忙于加载视图以及启动所需的任何内容应用程序。

所以,如果您尝试过这个解决方案并且它是否适用于您,请告诉我,一旦我做了进一步的测试,我将会这样做......

答案 1 :(得分:3)

在N次尝试失败后,该行为会导致应用程序禁用GameCenter。重新启动应用程序或登录gamecenter本身将使其重新联机。

我忘了我读过哪个文档,但是有一个Apple文档解释了这种行为。

答案 2 :(得分:3)

我也找不到一个好的答案,所以我决定在我开始收到取消错误后复制该消息。这仍处于开发阶段,但它基本上会更改按钮回调以显示错误警报,而不是显示排行榜。

只是一个注释,不确定这是否会被批准,因为我正在复制Apple错误消息。

-(void) gcLogin: (id) sender {
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
        if(error) {
            if([[error domain] isEqualToString:GKErrorDomain] && [error code] == GKErrorCancelled) {
                [ResourceManager showAlertWithTitle:@"GameCenter Disabled" message:@"Sign in with Game Center application to enable"];
                mGameCenterCancelled = YES;
            }
            NSLog(@"%@", [error description]);
        } else { 
            [self updateMenu];
            mGameCenterCancelled = NO;
        }
    }];
}

答案 3 :(得分:1)

我现在正在玩游戏中心我现在看到了同样的行为。文档中没有任何内容说明对话框只显示前几次。 在我的情况下,我想要预先告知用户是否已经登录到游戏中心,以便我可以正常行事。但是现在在向用户显示对话框之前我无法知道这一点。

由于我们在开发期间在沙箱中运行,因此这种行为当然可能在生产过程中表现不同,但这不是一件容易理解的事情。

答案 4 :(得分:0)

答案 5 :(得分:0)

我面临同样的问题。虽然我找不到强制弹出登录Game Center的同一对话框的方法,但我确实找到了一种方法来实现一条警告消息,当用户点击排行榜图标时“游戏中心被禁用”:

  

if([GKLocalPlayer localPlayer] .authenticated == NO)
  {
     //提示警告消息警告说游戏中心已被禁用
  }
  否则
  {
    //继续打开排行榜
  }

希望这有帮助!

答案 6 :(得分:0)

似乎iOS会完全停用游戏中心,并在用户选择禁用游戏中心后阻止其提示(该选项会出现在您的第五个游戏中心取消登录)。

将设备恢复到原始状态,再次显示登录提示。只需使用正常工作的Game Center帐户(非测试人员)使用Game Center应用程序登录即可。一旦你进入,退出。它应该会在你的应用中再次开始提示你。