如何更快地检测到对等点的断开连接?

How can I detect the disconnection of a peer more quickly?

我正在使用 Multipeer Connectivity 框架制作一款回合制多人游戏。

当一个同伴因为任何原因断开连接时,我希望那个玩家被一个 AI 取代。这样其他玩家就可以继续游戏了。

为此,我显然需要检测玩家何时断开连接。我知道我可以通过在 MCSessionDelegate:

中实现 session(_ :peer:didChange:) 来做到这一点
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {        
    if state == .notConnected {
        // someone has disconnected, handle this...
    }
}

问题是,这个方法只是在玩家真正断开连接后的一段时间(几秒)后才被调用。

让其他玩家等待几秒钟对我来说似乎是糟糕的用户体验,所以我希望尽快调用 session(_ :peer:didChange:) 方法。

我知道我可以在 viewDidDisappear 中向所有连接的同伴发送信号,表明该玩家已退出游戏。但这只能处理一种情况——调用 viewDidDisappear 时。还有很多其他方法可以断开游戏连接,例如移动到蓝牙范围之外、打开飞行模式,甚至他们的应用程序崩溃。

好吧,归根结底涉及网络层,可能会有一些延迟。 您不会对 session(_ :peer:didChange:).

方法产生任何影响

在我看来,您只能发送一个常规 ping,如果这 return 比预期的时间长,应用程序会假定连接已断开。 当然,这可能会导致误报。所以应用程序认为连接已经死了,但与客户端的连接仍然有效。然后应用程序必须能够处理此问题。