首页 文章

来自不同网络的iOS GameCenter连接

提问于
浏览
2

我已经制作了iOS多人GameCenter游戏,但在发布之前发现了一个我不知道如何解决的问题 . 在编码过程中我使用了Ray Wenderlich教程http://www.raywenderlich.com/3276/how-to-make-a-simple-multiplayer-game-with-game-center-tutorial-part-12
显示GameCenter视图控制器,连接创建和游戏可以播放,直到两个设备在同一个Wifi网络上 . 如果我在手机上关闭Wifi并使用3G网络,那么尝试开始新游戏 - 在这种情况下,不再进行连接 . 两台设备互相找到,但挂在"Connecting..."屏幕上 . 它看起来像那样

  • (void)match:(GKMatch *)theMatch player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)状态
    不叫 . 任何想法如何解决或至少理解,问题究竟在哪里?

1 回答

  • 1
    • 我认为在您的特定情况下,问题是您的3G ISP限制来自必要端口的连接 . The Apple docs说:

    要使用Game Center ...必须为端口443(TCP),3478-3497(UDP),4398(UDP),5223(TCP),16384-16387(UDP)和16393-16472(UDP)启用端口转发)

    我试图在iPad上通过蓝牙连接到iPhone上时也遇到了这个问题:每个设备上都有“正在连接......”屏幕 . 但是,当我使用内置的iPad 3G(具有不同的资费计划)时,一切都很顺利 .

    • 只是提醒一下,在正常的配对场景中,可能无法调用 match:player:didChangeState: . 你还应该检查 match.expectedPlayerCount
    - (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch {
        //...
        if (theMatch.expectedPlayerCount == 0) {
            NSLog(@"Ready to start match!");
        }
    }
    
    • 此外我预计"Connecting..."屏幕会出现类似问题,但在Wifi网络上 . 它只在iOS6上重现,之后我尝试通过 -[GKMatch rematchWithCompletionHandler:^(GKMatch *match, NSError *error) {}] 重新匹配 .

    一台设备挂在"Connecting..."屏幕上,但在另一台 matchmakerViewController:didFindMatch: 被成功调用,但有趣的是 match.expectedPlayerCount 1121560 and match.playerIDs 阵列同时为空 .

    我认为发生这样的错误是因为我试图找到一个新的匹配,而前一个匹配尝试在同一时间重新连接后台线程 . 而且因为新的比赛被破坏了 .

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

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

相关问题