我正在使用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
时。还有很多其他与游戏断开连接的方法,例如,移动到蓝牙范围之外,打开飞行模式,甚至导致应用崩溃。
答案 0 :(得分:0)
嗯,归根结底,网络层已经涉及到,并且可能会有一些延迟。
您不会对方法session(_ :peer:didChange:)
产生任何影响。
我认为您只能发送一次常规ping,如果返回的时间比预期的长,则该应用程序认为连接已断开。 当然,这可能导致误报。因此,应用程序认为连接已终止,但与客户端的连接仍处于活动状态。然后,该应用必须能够处理此问题。