NWPathMonitor — o clasă din framework-ul Network în iOS și macOS pentru monitorizarea stării căii de rețea a dispozitivului. Conform Apple Developer Documentation (2025), NWPathMonitor permite aplicației să urmărească disponibilitatea rețelei, să determine tipul de interfață și să reacționeze la modificările conexiunii. NWPathMonitor oferă informații despre tipul conexiunii, costurile traficului și prezența internetului printr-un callback convenabil cu NWPath.
Principalele puncte
NWPathMonitor — este o clasă din framework-ul Network, introdusă de Apple în iOS 12 și macOS 10.14 Mojave. Oferă un API modern pentru urmărirea modificărilor căii de rețea a dispozitivului — combinația de interfețe de rețea prin care trece traficul aplicației.
Înainte de iOS 12, pentru monitorizarea rețelei se folosea biblioteca Reachability, construită pe framework-ul C SystemConfiguration. NWPathMonitor este o alternativă nativă Swift cu un API mai bogat, suport pentru tipuri moderne de conexiuni (VPN, multipath, LTE, 5G) și lucru integrat cu GCD.
Diferența cheie dintre NWPathMonitor și Reachability — obiectul NWPath oferă nu doar un status binar „disponibil/nedisponibil", ci o imagine completă a căii: interfețele utilizate, prioritatea lor, costurile, statusul roaming-ului și posibilitatea proxy și VPN. Dezvoltatorul primește informații exhaustive pentru a lua decizii privind cererile de rețea.
Framework-ul Network a apărut ca un înlocuitor modern pentru API-urile C de nivel scăzut — CFStream și BSD Sockets. Oferă o interfață unificată pentru comunicarea în rețea pe toate platformele Apple, inclusiv watchOS și tvOS. NWPathMonitor face parte din acest framework alături de NWConnection, NWListener și NWBrowser.
Framework-ul Network este scris în Swift și utilizează GCD pentru procesarea asincronă. Aceasta înseamnă că callback-urile NWPathMonitor sunt executate pe coada dispatch queue specificată, integrându-se cu arhitectura existentă de multi-threading a aplicației fără gestionarea manuală a firelor de execuție.
Utilizarea NWPathMonitor începe cu crearea unei instanțe a clasei și configurarea handler-ului pathUpdateHandler. Apoi se apelează metoda start cu specificarea cozii dispatch queue pe care se va executa closure. Oprirea monitorizării se face prin metoda cancel, care eliberează și resursele.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Rețea disponibilă")
} else {
print("Rețea indisponibilă")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor poate fi configurat să urmărească doar un anumit tip de interfață. Pentru aceasta se utilizează inițializatorul NWPathMonitor(requiredInterfaceType:) cu parametrul NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet sau .loopback. Dacă tipul nu este specificat, monitorizarea se face pentru toate interfețele.
Exemplu practic: o aplicație de streaming poate urmări doar Wi-Fi-ul și poate avertiza utilizatorul la trecerea pe date mobile. Verificarea isConstrained și isExpensive în NWPath permite determinarea dacă conexiunea curentă este tarifată sau limitată ca viteză.
Monitorizarea trebuie pornită la lansarea aplicației sau la ieșirea în prim-plan și oprită la trecerea în fundal. Se recomandă crearea unei singure instanțe NWPathMonitor pentru întreaga aplicație (singleton) și utilizarea acesteia din diferite module printr-un protocol sau un strat de servicii.
NWPath — obiectul transmis în pathUpdateHandler, care descrie starea curentă a căii de rețea. Conține cinci proprietăți cheie care acoperă majoritatea scenariilor de monitorizare a rețelei. NWPath.Status — o enumerare cu trei stări: satisfied (disponibil), unsatisfied (indisponibil) și requiresConnection (necesită conexiune).
| Proprietate | Tip | Descriere |
|---|---|---|
| status | NWPath.Status | Starea curentă a căii: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Lista tuturor interfețelor de rețea disponibile |
| gateways | [NWEndpoint] | Lista gateway-urilor utilizate pentru rutare |
| isExpensive | Bool | True dacă conexiunea este tarifată (date mobile, hotspot personal) |
| isConstrained | Bool | True dacă conexiunea este limitată ca viteză (modul Low Data) |
Proprietatea isExpensive — un flag critic pentru aplicațiile care lucrează cu volume mari de date. Dacă isExpensive = true, aplicația trebuie să reducă calitatea streamingului, să amâne descărcarea actualizărilor sau să avertizeze utilizatorul. isConstrained indică activarea modului Low Data Mode.
Pentru verificarea disponibilității internetului (nu doar a rețelei) se utilizează metoda usesInterfaceType. Dacă dispozitivul este conectat la Wi-Fi fără internet — NWPath poate afișa satisfied, dar accesul real lipsește. În astfel de cazuri este necesară o validare suplimentară prin NWConnection.
Să analizăm o implementare avansată a NWPathMonitor cu gestionarea costurilor, tipurilor de interfață și notificarea ViewModel-ului printr-un publisher. În exemplu se utilizează framework-ul Combine pentru actualizarea reactivă a UI la modificarea stării rețelei.
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
}
}
La pierderea conexiunii poate fi necesară nu doar notificarea UI-ului, ci și executarea unor acțiuni întârziate — de exemplu, salvarea unei ciorne de cerere pentru trimiterea ulterioară. Implementați o coadă de cereri întârziate care acumulează operațiile la statusul unsatisfied și le trimite la restabilirea satisfied.
Pentru această sarcină se potrivește perfect modelul ReachabilityManager cu delegat: NWPathMonitor notifică managerul, managerul actualizează coada și UI-ul. La schimbarea statusului în satisfied, coada se golește automat, iar UI-ul primește indicația restabilirii conexiunii.
Înainte de apariția NWPathMonitor, soluția standard pentru monitorizarea rețelei în iOS era biblioteca Reachability de la Apple (exemplu din documentație), construită pe SystemConfiguration. Diferențele principale: Reachability funcționează prin SCNetworkReachability în C, nu suportă tipurile moderne de rețele și oferă doar un răspuns binar despre disponibilitate.
NWPathMonitor rezolvă aceste limitări: este scris în Swift, suportă VPN, multipath, 5G și LTE, oferă informații detaliate despre fiecare interfață și funcționează asincron prin GCD. Reachability este încă utilizat în proiecte cu suport minim pentru iOS 11 și versiuni inferioare.
| Caracteristică | NWPathMonitor | Reachability |
|---|---|---|
| Versiune minimă | iOS 12 | iOS 2 |
| Limbaj | Swift (Network) | C (SystemConfiguration) |
| Tipuri de interfețe | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (general) |
| isExpensive | Da | Nu |
| Asincronitate | GCD (dispatch queue) | RunLoop |
| Interfețe multiple | Da (multipath) | Nu |
Dacă aplicația dvs. suportă iOS 11 și versiuni inferioare, Reachability rămâne singura opțiune. Pentru proiectele iOS 12+ se recomandă utilizarea directă a NWPathMonitor — se integrează mai bine cu codul Swift modern, Combine și SwiftUI.
Migrarea de la Reachability la NWPathMonitor este simplă: este suficient să înlocuiți apelurile SCNetworkReachability cu NWPathMonitor, păstrând aceeași logică de procesare. Stratul de abstractizare (protocolul NetworkMonitorProtocol) va permite comutarea între implementări fără modificarea logicii de business a aplicației.
Întrebări frecvente
NWPathMonitor este disponibil începând cu iOS 12.0, macOS 10.14, watchOS 5.0 și tvOS 12.0. Pentru proiectele care suportă versiuni mai vechi, utilizați Reachability din SystemConfiguration sau biblioteci wrapper cu compilare condiționată prin #available.
Satisfied înseamnă că traficul poate trece prin cel puțin o interfață. Unsatisfied — nicio interfață nu este disponibilă. Starea requiresConnection — calea necesită stabilirea conexiunii (de exemplu, VPN nu este conectat), iar traficul nu trece temporar.
Utilizați metoda usesInterfaceType pe NWPath: path.usesInterfaceType(.wifi) pentru Wi-Fi, path.usesInterfaceType(.cellular) pentru date mobile. Metoda returnează true dacă traficul curent trece prin tipul de interfață specificat.
Se recomandă întreruperea monitorizării în fundal pentru economisirea bateriei. Apelul monitor.cancel() în applicationDidEnterBackground și restartarea în applicationWillEnterForeground reduc consumul de energie. Pentru operațiuni critice, utilizați Background Task.
NWPathMonitor poate afișa satisfied chiar și la un portal captive. Pentru a determina accesul real la internet, efectuați o cerere HTTP către un endpoint de încredere prin NWConnection. Dacă apare un redirect — portalul este activ, este necesară autorizarea în WebView.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și