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

时间:2019-02-23 08:56:01

标签: ios swift multipeer-connectivity

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

当同龄人出于任何原因断开连接时,我希望该播放器由AI代替。这样游戏就可以继续为其他玩家使用。

为此,我显然需要检测玩家何时断开连接。我知道我可以通过在session(_ :peer:didChange:)中实现MCSessionDelegate来做到这一点:

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {        
    if state == .notConnected {
        // someone has disconnected, handle this...
    }
}

问题在于,该方法仅在播放器实际断开连接后的一小段时间(几秒钟)内被调用。

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

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

1 个答案:

答案 0 :(得分:0)

嗯,归根结底,网络层已经涉及到,并且可能会有一些延迟。 您不会对方法session(_ :peer:didChange:)产生任何影响。

我认为您只能发送一次常规ping,如果返回的时间比预期的长,则该应用程序认为连接已断开。 当然,这可能导致误报。因此,应用程序认为连接已终止,但与客户端的连接仍处于活动状态。然后,该应用必须能够处理此问题。