Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode GameKit匹配-邀请iOS5和iOS6之间的朋友_Xcode_Ios5_Ios6_Game Center_Gkmatchmaker - Fatal编程技术网

Xcode GameKit匹配-邀请iOS5和iOS6之间的朋友

Xcode GameKit匹配-邀请iOS5和iOS6之间的朋友,xcode,ios5,ios6,game-center,gkmatchmaker,Xcode,Ios5,Ios6,Game Center,Gkmatchmaker,我正在尝试在两人实时游戏中实现游戏中心邀请。因为在模拟器中不支持邀请,所以我在一个运行iOS5的设备和另一个运行iOS6的设备上测试它(这是特意做的) 如果我在任何一台设备上使用老式的内置GKMatchmakerViewControllerUI来启动invite,那么无论是iOS5设备启动invite还是iOS6设备启动invite,它都可以正常工作 但是,在iOS6中,我希望使用自己的UI选择要邀请的播放器,因此我使用GKMatchRequest以编程方式发出邀请,设置playersToInv

我正在尝试在两人实时游戏中实现游戏中心邀请。因为在模拟器中不支持邀请,所以我在一个运行iOS5的设备和另一个运行iOS6的设备上测试它(这是特意做的)

如果我在任何一台设备上使用老式的内置
GKMatchmakerViewController
UI来启动invite,那么无论是iOS5设备启动invite还是iOS6设备启动invite,它都可以正常工作

但是,在iOS6中,我希望使用自己的UI选择要邀请的播放器,因此我使用
GKMatchRequest
以编程方式发出邀请,设置
playersToInvite
属性

问题是,另一台(iOS5)设备收到推送通知,启动应用程序,运行
[GKMatchmaker sharedMatchmaker].inviteHandler
,显示带有邀请详细信息的游戏中心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计算机上invite处理程序的代码片段:

[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发送一个带有iOS5播放器id的
    findMatchForRequest
    请求
  • 推送通知显示在iOS5计算机上
  • 应用程序在iOS5机器上启动,并调用
    inviteHandler
  • GKMatchmakerViewController
    显示在iOS5机器上,其中包含invite详细信息,iOS6用户具有旋转的“连接”状态
  • 调用iOS6计算机上的
    invitereResponseHandler
    ,并发送
    finishMatchmakingForMatch
    请求
  • iOS5游戏中心屏幕上iOS6用户的状态从旋转的“连接”变为“准备就绪”,此时两名玩家都被标记为“准备就绪”
  • iOS6机器获得一个
    match:player:didChangeState:
    回调,将iOS5玩家显示为
    GKPlayerStateConnected
    ,因此就iOS6机器而言,匹配过程已经完成,游戏可以开始
  • 从现在起,iOS5机器上不会发生任何事情。它一直处于“等待[iOS6用户]开始游戏”状态,直到超时取消。它在任何时候都不会收到任何
    GKMatch
    对象,因此无法启动游戏
如果我在iOS6机器上使用标准的gamecenter用户界面而不是可编程的invite,那么一切都会顺利进行,这意味着标准用户界面必须做更多的事情来告诉另一台机器游戏必须启动。但是,我浏览了所有相关的Game Center对象,找不到其他要发送的内容

我应该再次提到,反向配置(iOS5使用标准UI启动invite)在两台机器上都可以正常工作


有人来帮忙吗?

我也有类似的问题。我所做的一件部分解决的事情是为ios6用户使用编程,为ios5用户使用viewController。我认为您也在这样做,但您的inviteHandler代码似乎只有viewController代码。你能完全解决你的问题吗