12

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

  1. 用户启动游戏。他会看到提示他登录 GameCenter 的系统警报。他暂时忽略了它。
  2. 过了一会儿,用户想要登录到 GameCenter 并单击(例如)排行榜菜单项。他现在选择取消而不是登录。
  3. 该过程重复多次。最终用户确实想要登录到 GameCenter。他再次单击排行榜菜单项。

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

玩 FruitNinja 我试图复制它。但是,在他们的情况下,每次我单击 GameCenter 项目(例如成就)时,都会出现“Game Center Disabled”的弹出窗口。

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

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

4

7 回答 7

8

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

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

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

或由于以下事实

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

你总是会收到一个带有代码 2 的 NSError 说“请求的操作已被取消。”。

我能找到的唯一区别是在 authenticateWithCompletionHandler-Request 和完成处理程序的执行之间传递的时间。

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

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

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

于 2012-01-16T11:07:11.787 回答
3

在 N 次不成功的尝试之后,该行为的效果是 - 禁用应用程序的 GameCenter。重新启动应用程序或登录游戏中心本身将使其恢复在线。

我忘记了我在哪个文档中读到的,但是那里有一个 Apple 文档可以解释这种行为。

于 2011-01-30T14:50:03.600 回答
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;
        }
    }];
}
于 2012-05-02T17:56:11.990 回答
1

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

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

于 2010-12-04T12:56:36.020 回答
0

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

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

希望这可以帮助!

于 2012-07-27T01:02:51.547 回答
0

似乎iOS将完全禁用Game Center并在用户选择禁用Game Center后阻止它提示(该选项将出现在您第五次第五次Game Center取消登录时)。

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

于 2013-06-26T10:09:19.050 回答
0

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

要点是在一个矩形“重要”。

于 2012-02-02T12:53:33.387 回答