来自不同网络的iOS GameCenter连接

来自不同网络的iOS GameCenter连接,ios,connection,game-center,multiplayer,Ios,Connection,Game Center,Multiplayer,我制作了一款iOS多人游戏中心游戏,但就在发布之前,我发现了一个问题,我不知道如何解决。在编码过程中,我使用了Ray Wenderlich教程 显示GameCenter视图控制器,创建连接并播放游戏,直到两台设备位于同一Wifi网络上。 如果我关掉手机上的Wifi,使用3G网络,然后试着开始新的游戏-在这种情况下,连接就不复存在了。两台设备都可以找到对方,但都挂在“连接…”屏幕上。看起来是这样的 -(无效)匹配:(GKMatch*)匹配玩家:(NSString*)玩家ID didChangeSt

我制作了一款iOS多人游戏中心游戏,但就在发布之前,我发现了一个问题,我不知道如何解决。在编码过程中,我使用了Ray Wenderlich教程
显示GameCenter视图控制器,创建连接并播放游戏,直到两台设备位于同一Wifi网络上。 如果我关掉手机上的Wifi,使用3G网络,然后试着开始新的游戏-在这种情况下,连接就不复存在了。两台设备都可以找到对方,但都挂在“连接…”屏幕上。看起来是这样的
-(无效)匹配:(GKMatch*)匹配玩家:(NSString*)玩家ID didChangeState:(GKPlayerConnectionState)状态
不叫。有没有解决问题的办法,或者至少了解问题到底在哪里

  • 我认为在您的特殊情况下,问题在于您的3G ISP限制了从必要端口的连接。说:

    要使用游戏中心。。。必须为端口443(TCP)、3478-3497(UDP)、4398(UDP)、5223(TCP)、16384-16387(UDP)和16393-16472(UDP)启用端口转发

    当我尝试在通过蓝牙连接到iPhone的iPad上玩游戏时,我也遇到了这个问题:每个设备上都有“连接…”屏幕。 但当我使用内置ipad3g(采用不同的收费方案)时,一切都很顺利

  • 只需提醒一下,在正常的配对场景中,
    match:player:didChangeState:
    可能不会被调用。您还应该检查匹配。expectedPlayerCount:

    - (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch {
        //...
        if (theMatch.expectedPlayerCount == 0) {
            NSLog(@"Ready to start match!");
        }
    }
    
  • 我还以为“连接…”屏幕会出现类似的问题,但在Wifi网络上。 它仅在iOS6上复制,在我之前通过
    -[GKMatch rematchWithCompletionHandler:^(GKMatch*match,NSError*error){}]
    尝试重新匹配之后

    一个设备挂在“连接…”屏幕上,但另一个设备成功调用了
    matchmakerViewController:didFindMatch:
    ,但有趣的是
    匹配。expectedPlayerCount
    0
    匹配。playerId
    数组同时为空

    我认为发生这种错误是因为我试图找到一个新的匹配,而上一个匹配试图同时在后台线程上重新连接。因为新的匹配被破坏了

    决定是等待调用rematchCompletion,然后再尝试寻找新的匹配项。在
    GKMatch
    中没有取消重新匹配的接口,因此我使用
    [[GKMatchmaker sharedMatchmaker]cancel]
    并在几秒钟后调用rematchCompletion,但出现错误,我们准备开始查找新的匹配

    我还发现旧的未命名GKMatch实例并没有被释放,而是继续存在于GameKit框架中的某个地方。如果他们的工作没有正确完成(即没有断开连接,或者在我的情况下没有取消重赛),他们可能会导致问题。因此,在删除对匹配对象的最后一个强引用之前,不要忘记调用
    -[GKMatch disconnect]
    并完成任何其他类型的工作


  • 我已经看到expectedPlayerCount为0,PlayerId也为空,与任何复赛无关。(我不使用复赛。)