【问题标题】:Why network status does not get updated in swift?为什么网络状态没有迅速更新?
【发布时间】:2020-01-10 10:30:23
【问题描述】:

我正在使用 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() 时没有指定网络类型,因此它会检测所有类型的连接。

【问题讨论】:

  • 所以您在视图加载之前关闭 wifi,查看警报,然后重新打开 wifi,然后点击重试按钮?
  • @DavidSteppenbeckPhD 是的,然后如果用户在重试时没有连接,请继续重复警报直到他连接。
  • 我没有使用过 Network 库,但我已经使用 Reachability 框架进行了类似的测试(打开/关闭 wifi)。导致问题的一件事实际上是在模拟器上进行测试 - 通知不可靠。但是,一切都在真实设备上运行。所以,我建议的第一件事是在真实设备上检查它。

标签: ios swift connectivity network-framework nwpathmonitor


【解决方案1】:

NWPath 是一个结构体,因此它是不可变的。它不会在给定的 pathUpdateHandler 调用中改变。

一旦网络路径可用,您将获得pathUpdateHandler 的后续调用,状态为.satisfied

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

在您的连接上替代或额外使用.waitsForConnectivity

【讨论】:

  • 我同意它可能不是显示警报的最佳 UX 方法,但是我有使用警报实现确切 UX 的说明,因此无法更改。我还在黑暗中。如果 NWPath 在给定的调用中不会改变,那么它有什么用处呢?通过查看苹果文档,我只看到三个案例,.satisfied - .unsatisfied 和 .requiresConnection。我似乎找不到 .available 和 .waitsForConnectivity。我们都在看同一个图书馆吗?
  • 抱歉,.available 是我的错字。 .waitsForConnectivity 是您在网络连接上设置的属性;请参阅developer.apple.com/videos/play/wwdc2018/715 您遇到的用户体验问题是“重试”并不能真正解决问题。您可以做的是使用路径监控来更新指示是否存在网络连接的属性。然后,当用户尝试网络操作时,您检查该属性,如果不是.satisfied,则显示您的警报。然后您可以检查此属性,如果用户已连接,则该属性可能已更新
  • 我明白你的意思。我确实创建了一个 var 来使用值观察器跟踪我的 networkStatus,在该值观察器中我检查它是否满意我显示警报。如果用户仍未连接,现在唯一的问题是重复警报(重试)。我如何做到这一点?
  • 重试应该与您尝试的任何网络操作有关,而不是与网络本身的状态有关。当您尝试网络操作时,请检查您的财产并在必要时显示警报。这样,当您重试网络操作时,您将再次检查该属性并在必要时再次显示警报。如果未尝试任何网络操作,则网络状态的更改不应显示警报,它应该只更新属性。 .
  • 真的,虽然你应该反对这个用户体验。 Apple 特别建议不要进行飞行前网络检查,因为网络状态随时可能发生变化。 “现在”的网络可用性并不能保证网络操作将在一秒钟内成功,因此无论如何您都需要处理网络错误。这就是我所说的重试警报应该与网络操作而不是网络状态相关联的意思。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 2021-06-07
  • 2017-01-25
  • 2022-01-16
  • 2021-10-05
  • 1970-01-01
  • 2016-12-13
  • 2019-01-25
相关资源
最近更新 更多