1

我们正在使用 GKSession 来设置游戏。这适用于 2 台设备,其中一台设备使用 GKSessionModeServer 设置,另一台使用 GKSessionModeClient。

但是,一旦我们有 2 个或更多客户端(3 个设备;1 个主机和 2 个客户端),其中一个客户端将在某个时候随机断开连接。没有调用错误处理程序(didFailWithError 或 connectionWithPeerFailed),只有服务器和客户端上的 didChangeState。断开连接通常在一分钟内发生,有时更短。

所有设备(2 个 iPhone 和 1 个模拟器)都在同一个无线网络上。一台物理设备运行iOS6.0.1,另一台运行5.1.1,在连接模拟器时都可以保持连接。只有 3 台设备(2 台真实设备,1 台模拟设备)才会出现问题。

任何帮助将不胜感激。

4

1 回答 1

3

我有同样的问题,但在我的应用程序中,当我连接第三个或第四个客户端(随机)时会发生这个问题。服务器收到断开连接事件,但客户端冻结。我注意到这总是最后一个连接的客户端在几秒钟后断开连接。我不明白如何解决这个问题,我找到了一个名为 idea flight 的应用程序,它通过 gamekit 管理客户端/服务器连接,最多可以管理 15 个客户端(如 GameKit 文档中所述),我对其进行了测试并且它可以工作。我在代码上迷失了三天,我正在考虑切换到标准套接字通信,但我将失去蓝牙支持。

编辑:我找到了问题的原因。当网络由同时运行 iOS 6 和早期 iOS 版本的设备组成时,就会出现此问题。如果网络仅由运行 iOS6 或仅以前版本的设备组成,一切都很好。更准确地说,这不是崩溃,而是卡住的客户端有一些线程正在等待互斥体,这意味着 GameKit 导致我们的应用程序陷入死锁。在 Apple Developer's Forum 上阅读时,我知道一些用户直接向 Apple 报告了此错误,但 Apple 没有回复他们。因此,目前,确保基于 GKSession 的应用程序安全运行的唯一方法是仅支持 iOS 6 或使用 Bonjour、套接字和低级蓝牙 API 从头开始​​编写网络通信系统。

于 2012-12-12T19:22:41.240 回答