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 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 захтев ка поузданом endpoint-у преко NWConnection. Ако стигне редирект — портал је активан, потребна је ауторизација у WebView.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође