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 网络,然后尝试开始新游戏 - 在这种情况下不再建立连接。两台设备都能找到对方,但挂在“正在连接...”屏幕上。看起来像
- (void)match:(GKMatch *)theMatch player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
不叫。任何想法如何解决它或至少理解问题到底出在哪里?

4

1 回答 1

1
  1. 我认为在您的特定情况下,问题在于您的 3G ISP 限制了来自必要端口的连接。苹果文档说:

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

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

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

    - (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch {
        //...
        if (theMatch.expectedPlayerCount == 0) {
            NSLog(@"Ready to start match!");
        }
    }
    
  3. 我也预计“正在连接...”屏幕会出现类似问题,但在 Wifi 网络上。它仅在 iOS6 上复制,并且在我之前尝试过 rematch 之后-[GKMatch rematchWithCompletionHandler:^(GKMatch *match, NSError *error) {}]

    一台设备挂在“正在连接...”屏幕上,但另一台设备matchmakerViewController:didFindMatch:被成功调用,但有趣的是,match.expectedPlayerCount数组0 同时 match.playerIDs为空。

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

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

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

于 2012-12-26T09:09:04.523 回答