NWPathMonitor: що це, моніторинг мережі та робота в iOS

Автор: IT Sectr Опубліковано: 2026-03-10 Час читання: 9 хв

NWPathMonitor — це клас з фреймворку Network в iOS та macOS для моніторингу стану мережевого шляху пристрою. Згідно з Apple Developer Documentation (2025), NWPathMonitor дозволяє додатку відстежувати доступність мережі, визначати тип інтерфейсу та реагувати на зміни підключення. NWPathMonitor надає інформацію про тип з’єднання, витрати трафіку та наявність інтернету через зручний зворотний виклик з 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("Мережа доступна")
            } else {
                print("Мережа недоступна")
            }
        }
        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 вказує на увімкнений режим низьких даних.

Для перевірки доступності інтернету (не лише мережі) використовуйте метод 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 була бібліотека 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-запит до надійного ендпоінту через NWConnection. Якщо відбувається перенаправлення — портал активний та вимагає авторизації в WebView.

Підсумки

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

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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