我制作了一款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)状态
不叫。任何想法如何解决或至少理解,问题究竟在哪里?
答案 0 :(得分: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!");
}
}
此外,我预计“连接...”屏幕出现类似问题,但在Wifi网络上。
它仅在iOS6上重现,之后我尝试通过-[GKMatch rematchWithCompletionHandler:^(GKMatch *match, NSError *error) {}]
重新匹配。
一个设备挂在“正在连接...”屏幕上但在另一个matchmakerViewController:didFindMatch:
上被成功调用,但有趣的是match.expectedPlayerCount
是0
和 match.playerIDs
数组同时为空。
我认为发生了这样的错误,因为我尝试在上一场比赛尝试在同一时间重新连接后台线程时找到新的匹配项。并且因为新的匹配被损坏。
决定等待 rematchCompletion 被调用,然后才尝试找到新匹配。 GKMatch
中没有用于取消重新匹配的界面,因此我使用[[GKMatchmaker sharedMatchmaker] cancel]
并在几秒钟后调用 rematchCompletion 并出现错误,我们已准备好开始寻找新匹配。
此外,我发现旧的未发布的GKMatch实例未被释放,并继续存在于GameKit框架中的某个地方。如果使用它们的工作没有正确完成(即没有断开连接,或者在我的情况下没有取消匹配),它们可能会引起问题。因此,在删除对匹配对象的最后一个强引用之前,不要忘记调用-[GKMatch disconnect]
并完成任何其他类型的工作。