我正在尝试在 2 人实时游戏中实现 Game Center 邀请。由于模拟器不支持邀请,我正在一台运行 iOS5 的设备和另一台运行 iOS6 的设备上进行测试(这是故意完成的)。
如果我在任一设备上使用老式的内置GKMatchmakerViewController
UI 来发起邀请,那么两种方式都可以正常工作——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 用户具有旋转的“正在连接”状态。 - iOS6
inviteeResponseHandler
机器上的 被调用并发送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 发起邀请)在两台机器上都可以正常工作。
帮助,有人吗?