2

我正在尝试在 2 人实时游戏中实现 Game Center 邀请。由于模拟器不支持邀请,我正在一台运行 iOS5 的设备和另一台运行 iOS6 的设备上进行测试(这是故意完成的)。

如果我在任一设备上使用老式的内置GKMatchmakerViewControllerUI 来发起邀请,那么两种方式都可以正常工作——iOS5 设备发起邀请以及 iOS6 设备发起邀请。

但是,在 iOS6 中,我想使用自己的 UI 来选择要邀请的玩家,所以我使用GKMatchRequest以编程方式发出邀请,设置playersToInvite属性。

问题是,另一台(iOS5)设备收到推送通知,启动应用程序,运行[GKMatchmaker sharedMatchmaker].inviteHandler,显示带有邀请详细信息的 Game Center UI,但即使 iOS6 设备发送finishMatchmakingForMatch请求 - iOS5 设备也不会进行任何操作更远。iOS5 机器上没有调用其他处理程序/委托,没有GKMatch返回任何对象,它继续显示 Game Center UI,两个玩家都标记为“就绪”,并显示一条消息“等待 [iOS6 玩家] 开始游戏”。此 UI 上的唯一按钮是取消按钮。

下面是在 iOS6 机器上发送邀请的代码片段:

GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = [NSArray arrayWithObject:playerID];
request.inviteMessage = message;
request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response)
{
   if (response == GKInviteeResponseAccepted)
      [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:self.match];
};
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error)
{
   ... [whatever]
}];

这是 iOS5 机器上的邀请处理程序的代码片段:

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite)
{
    if (acceptedInvite)
    {
        GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease];
        mmvc.matchmakerDelegate = self;
        [navController presentModalViewController:mmvc animated:YES];
    });
    else if (playersToInvite)
    {
        ... [whatever]  
    }
}

顺序如下:

  • iOS6 发送一个findMatchForRequest带有 iOS5 播放器 ID 的请求。
  • 推送通知显示在 iOS5 机器上。
  • 该应用程序在 iOS5 机器上启动inviteHandler并被调用。
  • 显示GKMatchmakerViewController在带有邀请详细信息的 iOS5 机器上,并且 iOS6 用户具有旋转的“正在连接”状态。
  • iOS6inviteeResponseHandler机器上的 被调用并发送finishMatchmakingForMatch请求。
  • iOS5游戏中心屏幕中iOS6用户的状态从旋转的“Connecting”变为“Ready”,此时两个玩家都被标记为“Ready”。
  • iOS6机器收到match: player: didChangeState:回调,显示iOS5播放器为GKPlayerStateConnected,对于iOS6机器来说,比赛过程结束,可以开始比赛了。
  • 从现在开始,iOS5 机器上不会发生任何事情。它卡在“等待[iOS6用户]开始游戏”,直到它被超时取消。它在任何时候都不会收到任何GKMatch对象,因此它无法开始游戏。

因为如果我在 iOS6 机器上使用标准 Game Center UI 而不是可编程邀请,一切正常,这意味着标准 UI 必须做更多的事情来告诉另一台机器游戏必须开始。但是,我浏览了所有相关的 Game Center 对象,但找不到要发送的任何其他内容。

我应该再次提到反向配置(iOS5 使用标准 UI 发起邀请)在两台机器上都可以正常工作。

帮助,有人吗?

4

1 回答 1

0

我有个类似的问题。我为部分解决而做的一件事是为 ios6 用户使用编程,为 ios5 用户使用 viewController。我认为您也在这样做,但您的邀请处理程序代码似乎只有 viewController 代码。你能完全解决你的问题吗?

于 2013-03-26T10:27:19.723 回答