ios - 如何更快地检测到对端断线?

标签 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...
    }
}

问题是,这个方法仅在玩家实际断开连接后一段时间(几秒钟)才会被调用。

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

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

最佳答案

好吧,最终会涉及到网络层,并且可能会出现一些延迟。 您不会对 session(_ :peer:didChange:) 方法产生任何影响。

在我看来,您只能发送一个常规 ping,如果返回的时间确实比预期长,则应用程序会假定连接已断开。 当然,这可能会导致误报。因此应用程序认为连接已断开,但与客户端的连接仍然处于事件状态。应用程序必须能够处理这个问题。

关于ios - 如何更快地检测到对端断线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839887/

相关文章:

ios - 为什么 iPhone 5s UI 元素在 iPhone6 上不缩放?

ios - 如果响应通知调用 view.window.center 为 0,0,否则为 160,284

swift - Sqlite.swift 缺少标签 "where"

ios - 对泛型类型 'Set' 的引用需要 <...> 中的参数 & 无法推断泛型参数 'element'

ios - 多点连接自动静默连接

ios - 多点连接 : Share Files to all peers simultaneously

iOS:自签名证书有问题。 SSL 握手错误 (-9824)

ios - 使用 swift 3 通过键盘移动 View

ios - 如何在 Swift 中做嵌套字典

ios - 我可以通过 iOS Multipeer Connectivity 发送多大的消息?