为什么当路径满足时,NWPathMonitor 不提供路径更新?

Mar*_*ark 3 swift nwpathmonitor

我有一个名为NetworkPathMonitor的简单类,如下所示:

class NetworkPathMonitor: ObservableObject, Cancellable {
    @Published var path: NWPath? = nil
    
    let monitor = NWPathMonitor()
    
    init() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                self?.path = path
            }
        }
        monitor.start(queue: DispatchQueue.global(qos: .background))
    }
    
    func cancel() {
        monitor.cancel()
    }
    
    deinit {
        cancel()
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管pathUpdateHandler在我禁用和启用 WiFi 时调用,但结果并不总是可靠。当我禁用 WiFi 时,当前路径是unsatisfied (No network route),但是当我再次启用 WiFi 时,它会pathUpdateHandler再次使用相同的路径进行呼叫unsatisfied (No network route)

然而,在我的用户界面中,我有一个“重试”按钮。当我按下它时,它将销毁当前的监视器并建立一个新的监视器。第一条消息现在说satisfied (Path is satisfied), interface: en0。这意味着,WiFi 可能需要一些时间才能建立网络路由,但当网络可用时,它不会pathUpdateHandler再次呼叫。

Mar*_*ark 10

该代码确实可以在真实设备上运行。

不要NWPathMonitor在 iOS 模拟器上进行测试,因为它不会给您提供可靠的结果。