2

我正在使用 iOS 12 中引入的新“网络”库,但我无法弄清楚为什么在用户连接后网络状态没有更新为 .satisfied。

这是到目前为止的代码:

import Network

class MapViewController: UIViewController {

    let networkMonitor = NWPathMonitor()
    let queue = DispatchQueue(label: "NetworkMonitor")

    override func viewDidLoad() {
        super.viewDidLoad()

        // check for internet connection
        networkMonitor.pathUpdateHandler = { path in
            if path.status != .satisfied {

                // alert the user to check internet connection
                let alert = UIAlertController(title: "Internet Error", message: "Unable to connect. Please check your internet connection.", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
                alert.addAction(UIAlertAction(title: "Retry", style: .default, handler: { (action) in
                    // TODO: after retry should update status but its not updated
                    print("Status after retry: \(path.status)")
                }))
                self.present(alert, animated: true, completion: nil)
            } else {
                print(path.status)
            }
        }


        networkMonitor.start(queue: queue)
     }
}

为了在模拟器中复制丢失的连接情况,我在视图加载之前关闭了 wifi 连接,当警报出现时,点击重试。令人惊讶的是,重试后的状态仍然是 .unsatisfied。为什么状态没有更新?

目标是点击“重试”,如果用户仍未连接,则继续显示警报,当用户连接时,点击重试警报应该被解除。

为了进行简单的网络监视器设置,您可以查看本教程: https ://medium.com/@rwbutler/nwpathmonitor-the-new-reachability-de101a5a8835

请注意,我在实例化 NWPathMonitor() 时没有指定网络类型,因此它会检测所有类型的连接。

4

1 回答 1

6

NWPath是一个结构,因此它是不可变的。它不会在给定的pathUpdateHandler.

一旦网络路径变得可用,您将获得一个pathUpdateHandler带有.satisfied状态的后续调用。

从用户体验的角度来看,它可能不是显示模式警报的好方法。您通常会使用其他一些指示器(吐司或图标)指示网络连接不可用,一旦网络可用,这些指示器就会消失或更改。

或者或另外.waitsForConnectivity在您的连接上使用。

于 2019-09-08T10:39:42.773 回答