标签: nwpathmonitor

为什么当路径满足时,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再次呼叫。

swift nwpathmonitor

3
推荐指数
1
解决办法
2269
查看次数

将 NWPathMonitor 与 Swift 现代并发 (AsyncStream) 与 GCD (DispatchQueue) 结合使用

我注意到start(queue:)中的方法NWPathMonitor需要类型为 的队列DispatchQueue。有没有办法使用 Swift 现代并发来实现这一点,可能使用AsyncStream

使用Apple文档AsyncStream,我已经创建了扩展NWPathMonitor,但我无法启动NWPathMonitor显示器,任何建议将不胜感激,谢谢

extension NWPathMonitor {
  static var nwpath: AsyncStream<NWPath> {
    AsyncStream { continuation in
      let monitor = NWPathMonitor()
      monitor.pathUpdateHandler = { path in
        continuation.yield(path)
      }
      continuation.onTermination = { @Sendable _ in
        monitor.cancel()
      }
      // monitor.start(queue: )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

阅读苹果的文档

concurrency swift nwpathmonitor asyncstream

3
推荐指数
1
解决办法
712
查看次数

如何确定 Wi-Fi 是否有互联网连接

我想知道 Wi-Fi 是否有互联网连接。有时我们的设备已连接 Wi-Fi,但 Wi-Fi 没有互联网连接。

NWPathMonitor 或 Connectivity 第三方。我尝试过,但这并不是万无一失的。

我知道我可以编写一个方法来 ping 服务器,但这是一件非常低效且成本高昂的事情。

有任何想法吗?

connectivity wifi ios nwpathmonitor

1
推荐指数
1
解决办法
506
查看次数