我正在开发 macOS 应用程序,想要检查连接状态。我使用 NWPathMonitor 创建了一个简单的连接观察器;我将它用作环境对象:
@Observable
class ConnectivityMonitor {
private let queue = DispatchQueue(label: "ConnectivityMonitorQueue")
private let monitor = NWPathMonitor()
private(set) var isConnected: Bool = false
init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
print("network path changed: ", path.status)
}
}
monitor.start(queue: queue)
}
}
要检查不同的连接状态,我使用 Apple 随 Xcode 附加工具提供的 Network Link Conditioner prefpane(我将其称为 NLC)。
我不知道为什么,但 NWPathMonitor 不响应 NLC 配置文件更改。例如;我将 NLC 配置文件设置为
100% Loss,这意味着网络上根本没有互联网连接。但是 NWPathMonitor 的 pathUpdateHandler
没有被调用。我错过了什么吗?谢谢。
NWPathMonitor
正在检查路线是否存在。我所说的路由是指有一个网络接口可以接受发往给定地址的数据包。这条路线存在。它碰巧丢弃了每个数据包,但监视器不知道这一点,也无法知道这一点。了解数据包是否将被传送的唯一方法是发送数据包并接收响应。
NWPathMonitor
根本不发送任何数据包,因此看不到丢包。通常,“可达性”检查的使用有限。他们可以告诉您系统甚至不会尝试发送数据包,因为无线电已关闭。但他们无法告诉您您发送的消息将被传递。最后,你必须发送数据包,看看会发生什么。
这不是
NWPathMonitor
的失败。这是关于网络的基本事实。他们就像邮局。没有办法知道你放入邮箱的一封信是否真的会送达,如果送达,对方是否会回复。
NWPathMonitor
是在告诉你“是的,拐角处有一个邮箱,而且没有锁。”如果您的邮递员决定将所有信件扔进沟里(100% 丢包),则无法提前知道这一点。