我制作了一款 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
不叫。任何想法如何解决它或至少理解问题到底出在哪里?
1 回答
我认为在您的特定情况下,问题在于您的 3G ISP 限制了来自必要端口的连接。苹果文档说:
要使用 Game Center ... 必须为端口 443 (TCP)、3478-3497 (UDP)、4398 (UDP)、5223 (TCP)、16384-16387 (UDP) 和 16393-16472 (UDP) 启用端口转发
尝试在通过蓝牙连接到 iPhone 的 iPad 上播放时,我也遇到了这个问题:每台设备上都有“正在连接...”屏幕。但是当我使用内置的 iPad 3G(具有不同的资费计划)时,一切都很好。
只是提醒一下,在正常的配对场景下
match:player:didChangeState:
可能不会被调用。您还应该检查match.expectedPlayerCount
:- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch { //... if (theMatch.expectedPlayerCount == 0) { NSLog(@"Ready to start match!"); } }
我也预计“正在连接...”屏幕会出现类似问题,但在 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]
因此,在删除对匹配对象的最后一个强引用之前,不要忘记调用并完成任何其他类型的工作。