在我使用GameCenter开发的游戏中,我想处理以下场景:
- 用户启动游戏。系统会显示系统警报,提示他登录GameCenter。他暂时忽略了它。
- 过了一会儿,用户想要登录GameCenter并点击(例如)Leaderboards菜单项。他现在选择取消而不是登录。
- 这个过程重复了好几次。最终用户想要登录GameCenter。他再次单击Leaderboard菜单项。
在我的测试中,我发现通过调用“authenticateWithCompletionHandler”(由Apple的示例GameCenterManager调用)引发的警报弹出窗口建议登录到GameCenter只出现有限次数(4或5)。最后一次显示,它显示“游戏中心已禁用,请使用Game Center应用程序登录以启用”Afterwards“。之后,调用authenticateWithCompletionHandler不再执行任何操作 - 根本没有提示。
玩FruitNinja我试图复制这个。但是,在他们的情况下,每次我点击GameCenter项目(例如,成就)时,会出现“禁止游戏中心”的弹出窗口。
我想要做的是复制功能:也就是说,如果您没有登录到GameCenter,则在您单击Leaderboard菜单项时始终显示标准游戏中心警报。
有没有办法了解标准的“登录游戏中心”警报是否已经出现,或者强制它始终出现(而不仅仅是前几次尝试)?
在N次尝试失败后,该行为会对应用程序禁用GameCenter。重新启动应用程序或登录gamecenter本身将使其重新联机。
我忘了我读过哪个doc,但是有一个Apple doc可以解释这种行为。
这是一个解决此问题的想法:
无论“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需要更长的时间才能取消请求,因为设备正在忙于加载视图以及启动所需的任何内容该应用程序。
所以让我知道你是否尝试过这个解决方案,如果它对你有用,我会做一次进一步的测试......
我也找不到一个好的答案,所以我决定在我开始收到取消错误后复制该消息。这仍处于开发阶段,但它基本上会更改按钮回调以显示错误警报,而不是显示排行榜。
只是一个注释,不确定这是否会被批准,因为我正在复制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;
}
}];
}
我现在正在玩游戏中心我现在看到了同样的行为。文档中没有任何内容说明对话框只显示前几次。
在我的情况下,我想事先告诉用户是否已经登录到游戏中心,这样我就可以正常行事。但是现在在向用户显示对话框之前我无法知道这一点。
由于我们在开发期间在沙箱中运行,因此这种行为当然可能在生产过程中表现不同,但这不是一件容易理解的事情。
我面临同样的问题。虽然我找不到强制弹出登录Game Center的同一对话框的方法,但我确实找到了一种方法来实现一条警告消息,当用户点击排行榜图标时“游戏中心被禁用”:
if([GKLocalPlayer localPlayer] .authenticated == NO)
{
//提示警告消息警告说游戏中心已被禁用
}
其他
{
//继续打开排行榜
}
希望这可以帮助!
似乎iOS将完全禁用游戏中心,并在用户选择禁用游戏中心后阻止其提示(该选项将出现在您的第五个第五游戏中心取消登录)。
将设备恢复到原始状态,再次出现登录提示。只需使用正常工作的Game Center帐户(非测试人员)使用Game Center应用程序登录即可。一旦你进入,退出。它应该会开始在您的应用中再次提示您。