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 за асинхронна обработка. Това означава, че callback-овете на NWPathMonitor се изпълняват на указаната опашка dispatch queue, интегрирайки се със съществуващата многонишкова архитектура на приложението без ръчно управление на нишките.
Използването на NWPathMonitor започва с създаване на инстанция на класа и конфигуриране на handler-а 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("Мрежата е налична")
} 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 — обектът, предаван на 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 рамката за реактивно актуализиране на 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 и повторното стартиране в applicationWillEnterForeground намалява консумацията на енергия. За критични операции използвайте Background Task.
NWPathMonitor може да показва satisfied дори при captive портал. За определяне на реален достъп до интернет изпълнете HTTP заявка към доверен endpoint чрез NWConnection. Ако пристигне пренасочване — порталът е активен, изисква се авторизация в WebView.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също