NWPathMonitor:是什么,网络追踪及在iOS中的使用

作者: IT Sectr 发布日期: 2026-03-10 阅读时间: 9 分钟

NWPathMonitor — 来自 iOS 和 macOS 中 Network 框架的一个类,用于监控设备网络路径的状态。根据 Apple Developer Documentation (2025),NWPathMonitor 允许应用程序跟踪网络可用性、确定接口类型并响应连接变化。NWPathMonitor 通过方便的 NWPath 回调提供有关连接类型、流量成本和互联网可用性的信息。

要点

  • NWPathMonitor — Network 框架的类,用于在 iOS 和 macOS 中异步监控网络路径。
  • NWPath 包含有关网络可用性、接口类型(Wi-Fi、蜂窝数据、以太网)和成本状态的信息。
  • start 方法 在指定的 dispatch queue 上启动监控,cancel 方法停止监控。
  • pathUpdateHandler 属性 — 在每次网络路径状态更改时调用的闭包。
  • NWPathMonitor 支持通过 requiredInterfaceType 参数按所需接口类型进行过滤。

什么是 NWPathMonitor?

NWPathMonitor — 是 Network 框架中的一个类,由 Apple 在 iOS 12 和 macOS 10.14 Mojave 中引入。它提供了用于跟踪设备网络路径(应用程序流量通过的网络接口组合)变化的现代 API。

在 iOS 12 之前,网络监控使用的是基于 C 框架 SystemConfiguration 构建的 Reachability 库。NWPathMonitor 是原生 Swift 替代方案,拥有更丰富的 API,支持 现代连接类型(VPN、multipath、LTE、5G)并与 GCD 内置集成。

NWPathMonitor 与 Reachability 的关键区别 — NWPath 对象不仅提供二进制的 “可用/不可用” 状态,还提供路径的完整画面:使用的接口、它们的优先级、成本、漫游状态以及 代理和 VPN 的可能性。开发人员获得全面的信息来做出关于网络请求的决策。

Network 框架的历史

Network 框架是作为低级 C API — CFStream 和 BSD Sockets 的现代替代品而出现的。它为所有 Apple 平台(包括 watchOS 和 tvOS)上的网络通信提供统一的接口。NWPathMonitor 与 NWConnection、NWListener 和 NWBrowser 一起是这个框架的一部分。

Network 框架用 Swift 编写,并使用 GCD 进行异步处理。这意味着 NWPathMonitor 的回调在指定的 dispatch queue 上执行,与应用程序现有的多线程架构集成,无需 手动线程管理

如何在应用程序中使用 NWPathMonitor

使用 NWPathMonitor 从创建类的实例和配置 pathUpdateHandler 处理程序开始。然后调用 start 方法,指定闭包将执行的 dispatch queue。停止监控通过 cancel 方法完成,该方法也会释放资源。

swift
import Network

class NetworkMonitor {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("monitor")

    func startMonitoring() {
        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                print("网络可用")
            } else {
                print("网络不可用")
            }
        }
        monitor.start(on: queue)
    }

    func stopMonitoring() {
        monitor.cancel()
    }
}

处理接口类型

NWPathMonitor 可以配置为仅跟踪特定的接口类型。为此使用 NWPathMonitor(requiredInterfaceType:) 初始化器,参数为 NWInterface.InterfaceType — .wifi、.cellular、.wiredEthernet 或 .loopback。如果未指定类型,则监控所有接口。

实际示例:流媒体应用程序可以仅跟踪 Wi-Fi,并在切换到蜂窝数据时警告用户。NWPath 中的 isConstrained 和 isExpensive 检查 允许确定当前连接是否被计费或速度受限。

监控的生命周期

监控应在应用程序启动或进入前台时启动,并在进入后台时停止。建议为整个应用程序创建 一个 NWPathMonitor 实例(单例),并通过协议或服务层从不同模块使用它。

NWPath 的属性和功能

NWPath — 传递给 pathUpdateHandler 的对象,描述网络路径的当前状态。它包含五个关键属性,覆盖了大多数网络监控场景。NWPath.Status — 具有三种状态的枚举:satisfied(可用)、unsatisfied(不可用)和 requiresConnection(需要连接)。

属性类型描述
statusNWPath.Status路径的当前状态:satisfied、unsatisfied、requiresConnection
availableInterfaces[NWInterface]所有可用网络接口的列表
gateways[NWEndpoint]用于路由的网关列表
isExpensiveBool如果连接被计费则为 true(蜂窝数据、个人热点)
isConstrainedBool如果连接速度受限则为 true(低数据模式)

检查成本和限制

isExpensive 属性 — 对于处理大量数据的应用程序至关重要的标志。如果 isExpensive = true,应用程序应降低流媒体质量、延迟更新下载或警告用户。isConstrained 表示低数据模式已启用。

要检查互联网可用性(不仅仅是网络),使用 usesInterfaceType 方法。如果设备连接到没有互联网的 Wi-Fi — NWPath 可能显示 satisfied,但实际访问不存在。在这种情况下,需要通过 NWConnection 进行额外验证。

NWPathMonitor 实现示例

让我们看一个高级的 NWPathMonitor 实现,包括成本处理、接口类型和通过发布者通知 ViewModel。在示例中,使用 Combine 框架 在网络状态更改时响应式更新 UI。

swift
import Network
import Combine

final class NetworkManager: ObservableObject {
    static let shared = NetworkManager()
    @Published private(set) var isConnected = true
    @Published private(set) var isExpensive = false

    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("NetworkMonitor")

    private init() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                self?.isConnected = path.status == .satisfied
                self?.isExpensive = path.isExpensive
            }
        }
        monitor.start(on: queue)
    }

    func checkInterface() -> NWInterface.InterfaceType {
        let path = monitor.currentPath
        if path.usesInterfaceType(.wifi) { return .wifi }
        if path.usesInterfaceType(.cellular) { return .cellular }
        return .other
    }
}

使用延迟操作处理网络丢失

在连接丢失时,可能不仅需要通知 UI,还需要执行延迟操作 — 例如,保存请求草稿以供稍后发送。实现一个 延迟请求队列,在 unsatisfied 状态下累积操作,并在 satisfied 恢复时发送它们。

对于这个任务,带有委托的 ReachabilityManager 模式非常理想:NWPathMonitor 通知管理器,管理器更新队列和 UI。当状态更改为 satisfied 时,队列自动清空,UI 收到连接恢复的指示。

NWPathMonitor vs Reachability

在 NWPathMonitor 出现之前,iOS 中网络监控的标准解决方案是 Apple 的 Reachability 库(来自文档的示例),构建在 SystemConfiguration 之上。主要区别:Reachability 通过 C 语言的 SCNetworkReachability 工作,不支持现代网络类型,并且仅提供关于可用性的二进制响应。

NWPathMonitor 解决了这些限制:用 Swift 编写,支持 VPN、multipath、5G 和 LTE,提供有关每个接口的详细信息,并通过 GCD 异步工作。Reachability 仍然用于最低支持 iOS 11 及更低版本的项目中。

特性NWPathMonitorReachability
最低版本iOS 12iOS 2
语言Swift (Network)C (SystemConfiguration)
接口类型Wi-Fi、蜂窝、以太网、VPNWi-Fi、WWAN(通用)
isExpensive
异步性GCD(dispatch queue)RunLoop
多接口有(multipath)

何时使用 Reachability

如果您的应用程序支持 iOS 11 及更低版本,Reachability 仍然是唯一的选择。对于 iOS 12+ 项目,建议立即使用 NWPathMonitor — 它与现代 Swift 代码、Combine 和 SwiftUI 集成得更好。

从 Reachability 迁移到 NWPathMonitor 很简单:只需将 SCNetworkReachability 调用替换为 NWPathMonitor,保持相同的处理逻辑。抽象层(NetworkMonitorProtocol 协议)将允许在不更改应用程序业务逻辑的情况下在实现之间切换。

常见问题

NWPathMonitor 所需的最低 iOS 版本是多少?

NWPathMonitor 从 iOS 12.0、macOS 10.14、watchOS 5.0 和 tvOS 12.0 开始可用。对于支持较旧版本的项目,请使用 SystemConfiguration 中的 Reachability 或通过 #available 进行条件编译的包装库。

NWPath.Status.satisfied 和 unsatisfied 有什么区别?

Satisfied 意味着流量可以通过至少一个接口。 Unsatisfied — 没有接口可用。requiresConnection 状态 — 路径需要建立连接(例如,VPN 未连接),流量暂时无法通过。

如何确定网络类型 — Wi-Fi 还是蜂窝?

在 NWPath 上使用 usesInterfaceType 方法:path.usesInterfaceType(.wifi) 用于 Wi-Fi,path.usesInterfaceType(.cellular) 用于蜂窝数据。如果当前流量通过指定的接口类型,该方法返回 true。

进入后台时需要取消 NWPathMonitor 吗?

建议在后台暂停监控以节省电池。在 applicationDidEnterBackground 中调用 monitor.cancel() 并在 applicationWillEnterForeground 中重新启动可降低能耗。对于关键操作,请使用 Background Task。

如何使用 NWPathMonitor 处理强制门户?

即使在强制门户中,NWPathMonitor 也可能显示 satisfied。要确定真正的互联网访问,通过 NWConnection 向 受信任的端点执行 HTTP 请求。如果收到重定向 — 门户处于活动状态,需要在 WebView 中进行授权。

总结

  • NWPathMonitor — Network 框架的类,用于在 iOS 12+ 中监控网络路径,支持 GCD 和 Combine。
  • NWPath 包含关于连接的完整信息:状态、接口类型、成本、限制和网关。
  • start 方法 在指定队列上启动监控,pathUpdateHandler 接收 NWPath 更新。
  • isExpensive 和 isConstrained 属性 允许识别计费和受限连接。
  • NWPathMonitor 已取代 iOS 12+ 的 Reachability,在 Swift 中提供更丰富的 API。
  • 按接口类型过滤 通过带有 requiredInterfaceType 参数的初始化器实现。
  • 对于后台工作,在 foreground 和 background 之间切换时应暂停和恢复监控。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读