问题 GameCenter登录提醒


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

  1. 用户启动游戏。系统会显示系统警报,提示他登录GameCenter。他暂时忽略了它。
  2. 过了一会儿,用户想要登录GameCenter并点击(例如)Leaderboards菜单项。他现在选择取消而不是登录。
  3. 这个过程重复了好几次。最终用户想要登录GameCenter。他再次单击Leaderboard菜单项。

在我的测试中,我发现通过调用“authenticateWithCompletionHandler”(由Apple的示例GameCenterManager调用)引发的警报弹出窗口建议登录到GameCenter只出现有限次数(4或5)。最后一次显示,它显示“游戏中心已禁用,请使用Game Center应用程序登录以启用”Afterwards“。之后,调用authenticateWithCompletionHandler不再执行任何操作 - 根本没有提示。

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

我想要做的是复制功能:也就是说,如果您没有登录到GameCenter,则在您单击Leaderboard菜单项时始终显示标准游戏中心警报。

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


2265
2017-11-30 18:27


起源

你有没有想过这个? - Thom Mahoney


答案:


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

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


3
2018-01-30 14:50



重新启动应用程序似乎无法解决问题。正如OP所述,另一个应用程序FruitNinja似乎使用API​​来检测这种状态。 - Thom Mahoney
我不认为FruitNinja正在使用API​​。在我的观察中他们所做的是以下内容:每当他们从GameCenter看到Code 2的错误时(“请求的操作已被取消。”)他们正在设置一个标记“gameCenterDisabled”。下次 用户 尝试访问游戏中心功能,他们正在显示警报 - thumbsup
仅供参考,在iOS7上,一旦禁用某个应用程序的游戏中心,通过游戏中心应用程序登录并不能解决问题。看到 stackoverflow.com/questions/19013328/... - Greg


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

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

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

或者由于这个事实

  • 在设备上禁用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需要更长的时间才能取消请求,因为设备正在忙于加载视图以及启动所需的任何内容该应用程序。

所以让我知道你是否尝试过这个解决方案,如果它对你有用,我会做一次进一步的测试......


8
2018-01-16 11:07



这是唯一的解决方案;不只是陈述“事实”。 - junkdog


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

只是一个注释,不确定这是否会被批准,因为我正在复制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
2018-05-02 17:56





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

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


1
2017-12-04 12:56





可能是链接会有所帮助(前三段): http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW9

重点是矩形“重要”。


0
2018-02-02 12:53





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

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

希望这可以帮助!


0
2017-07-27 01:02





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

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


0
2018-06-26 10:09