NWPathMonitor — класс из фреймворка Network в iOS и macOS для мониторинга состояния сетевого пути устройства. Согласно Apple Developer Documentation (2025), NWPathMonitor позволяет приложению отслеживать доступность сети, определять тип интерфейса и реагировать на изменения подключения. NWPathMonitor предоставляет информацию о типе соединения, расходах трафика и наличии интернета через удобный callback с NWPath.
Главное
NWPathMonitor — это класс из фреймворка Network, представленный Apple в iOS 12 и macOS 10.14 Mojave. Он предоставляет современный API для отслеживания изменений сетевого пути устройства — комбинации сетевых интерфейсов, через которые проходит трафик приложения.
До iOS 12 для мониторинга сети использовалась библиотека Reachability, построенная на C-фреймворке SystemConfiguration. 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, на которой будет выполняться closure. Остановка мониторинга выполняется методом 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("Network available")
} else {
print("Network unavailable")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor можно настроить на отслеживание только определённого типа интерфейса. Для этого используется инициализатор NWPathMonitor(requiredInterfaceType:) с параметром NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet или .loopback. Если тип не указан, мониторинг ведётся по всем интерфейсам.
Практический пример: приложение для стриминга может отслеживать только Wi-Fi и предупреждать пользователя о переходе на сотовые данные. Проверка isConstrained и isExpensive в NWPath позволяет определить, тарифицируется ли текущее соединение или ограничено по скорости.
Мониторинг должен запускаться при старте приложения или при выходе на передний план и останавливаться при уходе в фон. Рекомендуется создавать один экземпляр NWPathMonitor на всё приложение (singleton) и использовать его из разных модулей через протокол или сервисный слой.
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 указывает на включённый режим Low Data Mode.
Для проверки доступности интернета (не просто сети) используется метод usesInterfaceType. Если устройство подключено к Wi-Fi без интернета — NWPath может показывать satisfied, но фактический доступ отсутствует. В таких случаях требуется дополнительная валидация через NWConnection.
Рассмотрим продвинутую реализацию NWPathMonitor с обработкой расходов, типов интерфейса и уведомлением ViewModel через publisher. В примере используется Combine framework для реактивного обновления 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 была библиотека Reachability от Apple (пример из документации), построенная на SystemConfiguration. Основные отличия: Reachability работает через SCNetworkReachability на C, не поддерживает современные типы сетей и даёт только бинарный ответ о доступности.
NWPathMonitor решает эти ограничения: он написан на Swift, поддерживает VPN, multipath, 5G и LTE, предоставляет детальную информацию о каждом интерфейсе и работает асинхронно через GCD. Reachability по-прежнему используется в проектах с минимальной поддержкой iOS 11 и ниже.
| Характеристика | NWPathMonitor | Reachability |
|---|---|---|
| Минимальная версия | iOS 12 | iOS 2 |
| Язык | Swift (Network) | C (SystemConfiguration) |
| Типы интерфейсов | Wi-Fi, Cellular, Ethernet, 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. Для проектов, поддерживающих более старые версии, используйте Reachability из SystemConfiguration или библиотеки-обёртки с условной компиляцией через #available.
Satisfied означает, что трафик может проходить через хотя бы один интерфейс. Unsatisfied — ни один интерфейс не доступен. Состояние requiresConnection — путь требует установки соединения (например, VPN не подключён), и трафик временно не проходит.
Используйте метод usesInterfaceType на NWPath: path.usesInterfaceType(.wifi) для Wi-Fi, path.usesInterfaceType(.cellular) для сотовых данных. Метод возвращает true, если текущий трафик проходит через указанный тип интерфейса.
Рекомендуется приостанавливать мониторинг в фоне для экономии батареи. Вызов monitor.cancel() в applicationDidEnterBackground и повторный start в applicationWillEnterForeground снижают энергопотребление. Для критических операций используйте Background Task.
NWPathMonitor может показывать satisfied даже при каптивном портале. Для определения реального доступа в интернет выполните HTTP-запрос к trusted endpoint через NWConnection. Если приходит редирект — портал активен, требуется авторизация в WebView.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также