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 за асинхронна обработка. Това означава, че callback-овете на NWPathMonitor се изпълняват на указаната опашка dispatch queue, интегрирайки се със съществуващата многонишкова архитектура на приложението без ръчно управление на нишките.

Как да използваме NWPathMonitor в приложението

Използването на NWPathMonitor започва с създаване на инстанция на класа и конфигуриране на handler-а 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 показва активиран режим Low Data Mode.

За проверка на наличието на интернет (не само мрежа) се използва методът usesInterfaceType. Ако устройството е свързано към Wi-Fi без интернет — NWPath може да показва satisfied, но реалният достъп липсва. В такива случаи се изисква допълнителна валидация чрез NWConnection.

Примери за имплементация на NWPathMonitor

Нека разгледаме разширена имплементация на NWPathMonitor с обработка на разходи, типове интерфейс и уведомяване на ViewModel чрез publisher. В примера се използва 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 и повторното стартиране в applicationWillEnterForeground намалява консумацията на енергия. За критични операции използвайте Background Task.

Как да обработваме captive портали с NWPathMonitor?

NWPathMonitor може да показва satisfied дори при captive портал. За определяне на реален достъп до интернет изпълнете HTTP заявка към доверен endpoint чрез 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също