NWPathMonitor: что это, отслеживание сети и работа в iOS

Автор: IT Sectr Опубликовано: 2026-03-10 Время чтения: 9 мин

NWPathMonitor — класс из фреймворка Network в iOS и macOS для мониторинга состояния сетевого пути устройства. Согласно Apple Developer Documentation (2025), NWPathMonitor позволяет приложению отслеживать доступность сети, определять тип интерфейса и реагировать на изменения подключения. NWPathMonitor предоставляет информацию о типе соединения, расходах трафика и наличии интернета через удобный callback с NWPath.

Главное

  • NWPathMonitor — класс фреймворка Network для асинхронного мониторинга сетевого пути в iOS и macOS.
  • NWPath содержит информацию о доступности сети, типе интерфейса (Wi-Fi, сотовые данные, Ethernet) и статусе расходов.
  • Метод start запускает мониторинг на указанной очереди dispatch queue, метод cancel — останавливает.
  • Свойство pathUpdateHandler — closure, который вызывается при каждом изменении состояния сетевого пути.
  • NWPathMonitor поддерживает фильтрацию по требуемому типу интерфейса через параметр requiredInterfaceType.

Что такое NWPathMonitor?

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

Фреймворк 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, на которой будет выполняться closure. Остановка мониторинга выполняется методом 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("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

NWPath — объект, передаваемый в pathUpdateHandler, который описывает текущее состояние сетевого пути. Он содержит пять ключевых свойств, которые покрывают большинство сценариев мониторинга сети. NWPath.Status — перечисление с тремя состояниями: satisfied (доступен), unsatisfied (недоступен) и requiresConnection (требуется соединить).

СвойствоТипОписание
statusNWPath.StatusТекущее состояние пути: satisfied, unsatisfied, requiresConnection
availableInterfaces[NWInterface]Список всех доступных сетевых интерфейсов
gateways[NWEndpoint]Список шлюзов, используемых для маршрутизации
isExpensiveBoolTrue, если соединение тарифицируется (сотовые данные, личный хот-спот)
isConstrainedBoolTrue, если соединение ограничено по скорости (режим низких данных)

Проверка расходов и ограничений

Свойство isExpensive — критически важный флаг для приложений, работающих с большим объёмом данных. Если isExpensive = true, приложение должно снизить качество стриминга, отложить загрузку обновлений или предупредить пользователя. isConstrained указывает на включённый режим Low Data Mode.

Для проверки доступности интернета (не просто сети) используется метод usesInterfaceType. Если устройство подключено к Wi-Fi без интернета — NWPath может показывать satisfied, но фактический доступ отсутствует. В таких случаях требуется дополнительная валидация через NWConnection.

Примеры реализации NWPathMonitor

Рассмотрим продвинутую реализацию NWPathMonitor с обработкой расходов, типов интерфейса и уведомлением ViewModel через publisher. В примере используется Combine framework для реактивного обновления 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 была библиотека Reachability от Apple (пример из документации), построенная на SystemConfiguration. Основные отличия: Reachability работает через SCNetworkReachability на C, не поддерживает современные типы сетей и даёт только бинарный ответ о доступности.

NWPathMonitor решает эти ограничения: он написан на Swift, поддерживает VPN, multipath, 5G и LTE, предоставляет детальную информацию о каждом интерфейсе и работает асинхронно через GCD. Reachability по-прежнему используется в проектах с минимальной поддержкой iOS 11 и ниже.

ХарактеристикаNWPathMonitorReachability
Минимальная версияiOS 12iOS 2
ЯзыкSwift (Network)C (SystemConfiguration)
Типы интерфейсовWi-Fi, Cellular, Ethernet, VPNWi-Fi, WWAN (общий)
isExpensiveЕстьНет
АсинхронностьGCD (dispatch queue)RunLoop
Множественные интерфейсыЕсть (multipath)Нет

Когда использовать Reachability

Если ваше приложение поддерживает iOS 11 и ниже, Reachability остаётся единственным вариантом. Для iOS 12+ проектов рекомендуется сразу использовать NWPathMonitor — он лучше интегрируется с современным Swift-кодом, Combine и SwiftUI.

Миграция с Reachability на NWPathMonitor проста: достаточно заменить вызовы SCNetworkReachability на NWPathMonitor, сохранив ту же логику обработки. Слой абстракции (протокол NetworkMonitorProtocol) позволит переключаться между реализациями без изменения бизнес-логики приложения.

Часто задаваемые вопросы

Какая минимальная версия iOS требуется для NWPathMonitor?

NWPathMonitor доступен начиная с iOS 12.0, macOS 10.14, watchOS 5.0 и tvOS 12.0. Для проектов, поддерживающих более старые версии, используйте Reachability из SystemConfiguration или библиотеки-обёртки с условной компиляцией через #available.

Чем отличается NWPath.Status.satisfied от unsatisfied?

Satisfied означает, что трафик может проходить через хотя бы один интерфейс. Unsatisfied — ни один интерфейс не доступен. Состояние requiresConnection — путь требует установки соединения (например, VPN не подключён), и трафик временно не проходит.

Как определить тип сети — Wi-Fi или сотовая?

Используйте метод usesInterfaceType на NWPath: path.usesInterfaceType(.wifi) для Wi-Fi, path.usesInterfaceType(.cellular) для сотовых данных. Метод возвращает true, если текущий трафик проходит через указанный тип интерфейса.

Нужно ли отменять NWPathMonitor при уходе в фон?

Рекомендуется приостанавливать мониторинг в фоне для экономии батареи. Вызов monitor.cancel() в applicationDidEnterBackground и повторный start в applicationWillEnterForeground снижают энергопотребление. Для критических операций используйте Background Task.

Как обрабатывать каптивные порталы с NWPathMonitor?

NWPathMonitor может показывать satisfied даже при каптивном портале. Для определения реального доступа в интернет выполните HTTP-запрос к trusted endpoint через NWConnection. Если приходит редирект — портал активен, требуется авторизация в WebView.

Итоги

  • NWPathMonitor — класс фреймворка Network для мониторинга сетевого пути в iOS 12+ с поддержкой GCD и Combine.
  • NWPath содержит полную информацию о соединении: статус, типы интерфейсов, расходы, ограничения и шлюзы.
  • Метод start запускает мониторинг на указанной очереди, pathUpdateHandler получает обновления NWPath.
  • Свойства isExpensive и isConstrained позволяют определять тарифицируемые и ограниченные соединения.
  • NWPathMonitor заменил Reachability для iOS 12+, предоставляя более богатый API на Swift.
  • Фильтрация по типу интерфейса реализуется через инициализатор с параметром requiredInterfaceType.
  • Для фоновой работы мониторинг следует приостанавливать и возобновлять при переходе между foreground и background.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также