NWPathMonitor — 来自 iOS 和 macOS 中 Network 框架的一个类,用于监控设备网络路径的状态。根据 Apple Developer Documentation (2025),NWPathMonitor 允许应用程序跟踪网络可用性、确定接口类型并响应连接变化。NWPathMonitor 通过方便的 NWPath 回调提供有关连接类型、流量成本和互联网可用性的信息。
要点
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 框架是作为低级 C API — CFStream 和 BSD Sockets 的现代替代品而出现的。它为所有 Apple 平台(包括 watchOS 和 tvOS)上的网络通信提供统一的接口。NWPathMonitor 与 NWConnection、NWListener 和 NWBrowser 一起是这个框架的一部分。
Network 框架用 Swift 编写,并使用 GCD 进行异步处理。这意味着 NWPathMonitor 的回调在指定的 dispatch queue 上执行,与应用程序现有的多线程架构集成,无需 手动线程管理。
使用 NWPathMonitor 从创建类的实例和配置 pathUpdateHandler 处理程序开始。然后调用 start 方法,指定闭包将执行的 dispatch queue。停止监控通过 cancel 方法完成,该方法也会释放资源。
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 — 传递给 pathUpdateHandler 的对象,描述网络路径的当前状态。它包含五个关键属性,覆盖了大多数网络监控场景。NWPath.Status — 具有三种状态的枚举:satisfied(可用)、unsatisfied(不可用)和 requiresConnection(需要连接)。
| 属性 | 类型 | 描述 |
|---|---|---|
| status | NWPath.Status | 路径的当前状态:satisfied、unsatisfied、requiresConnection |
| availableInterfaces | [NWInterface] | 所有可用网络接口的列表 |
| gateways | [NWEndpoint] | 用于路由的网关列表 |
| isExpensive | Bool | 如果连接被计费则为 true(蜂窝数据、个人热点) |
| isConstrained | Bool | 如果连接速度受限则为 true(低数据模式) |
isExpensive 属性 — 对于处理大量数据的应用程序至关重要的标志。如果 isExpensive = true,应用程序应降低流媒体质量、延迟更新下载或警告用户。isConstrained 表示低数据模式已启用。
要检查互联网可用性(不仅仅是网络),使用 usesInterfaceType 方法。如果设备连接到没有互联网的 Wi-Fi — NWPath 可能显示 satisfied,但实际访问不存在。在这种情况下,需要通过 NWConnection 进行额外验证。
让我们看一个高级的 NWPathMonitor 实现,包括成本处理、接口类型和通过发布者通知 ViewModel。在示例中,使用 Combine 框架 在网络状态更改时响应式更新 UI。
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 出现之前,iOS 中网络监控的标准解决方案是 Apple 的 Reachability 库(来自文档的示例),构建在 SystemConfiguration 之上。主要区别:Reachability 通过 C 语言的 SCNetworkReachability 工作,不支持现代网络类型,并且仅提供关于可用性的二进制响应。
NWPathMonitor 解决了这些限制:用 Swift 编写,支持 VPN、multipath、5G 和 LTE,提供有关每个接口的详细信息,并通过 GCD 异步工作。Reachability 仍然用于最低支持 iOS 11 及更低版本的项目中。
| 特性 | NWPathMonitor | Reachability |
|---|---|---|
| 最低版本 | iOS 12 | iOS 2 |
| 语言 | Swift (Network) | C (SystemConfiguration) |
| 接口类型 | Wi-Fi、蜂窝、以太网、VPN | Wi-Fi、WWAN(通用) |
| isExpensive | 有 | 无 |
| 异步性 | GCD(dispatch queue) | RunLoop |
| 多接口 | 有(multipath) | 无 |
如果您的应用程序支持 iOS 11 及更低版本,Reachability 仍然是唯一的选择。对于 iOS 12+ 项目,建议立即使用 NWPathMonitor — 它与现代 Swift 代码、Combine 和 SwiftUI 集成得更好。
从 Reachability 迁移到 NWPathMonitor 很简单:只需将 SCNetworkReachability 调用替换为 NWPathMonitor,保持相同的处理逻辑。抽象层(NetworkMonitorProtocol 协议)将允许在不更改应用程序业务逻辑的情况下在实现之间切换。
常见问题
NWPathMonitor 从 iOS 12.0、macOS 10.14、watchOS 5.0 和 tvOS 12.0 开始可用。对于支持较旧版本的项目,请使用 SystemConfiguration 中的 Reachability 或通过 #available 进行条件编译的包装库。
Satisfied 意味着流量可以通过至少一个接口。 Unsatisfied — 没有接口可用。requiresConnection 状态 — 路径需要建立连接(例如,VPN 未连接),流量暂时无法通过。
在 NWPath 上使用 usesInterfaceType 方法:path.usesInterfaceType(.wifi) 用于 Wi-Fi,path.usesInterfaceType(.cellular) 用于蜂窝数据。如果当前流量通过指定的接口类型,该方法返回 true。
建议在后台暂停监控以节省电池。在 applicationDidEnterBackground 中调用 monitor.cancel() 并在 applicationWillEnterForeground 中重新启动可降低能耗。对于关键操作,请使用 Background Task。
即使在强制门户中,NWPathMonitor 也可能显示 satisfied。要确定真正的互联网访问,通过 NWConnection 向 受信任的端点执行 HTTP 请求。如果收到重定向 — 门户处于活动状态,需要在 WebView 中进行授权。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。