NWPathMonitor: ce este, urmărirea rețelei și lucrul în iOS

Autor: IT Sectr Publicat: 2026-03-10 Timp de citire: 9 min

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 — o clasă a framework-ului Network pentru monitorizarea asincronă a căii de rețea în iOS și macOS.
  • NWPath conține informații despre disponibilitatea rețelei, tipul de interfață (Wi-Fi, date mobile, Ethernet) și statusul costurilor.
  • Metoda start pornește monitorizarea pe coada dispatch queue specificată, metoda cancel o oprește.
  • Proprietatea pathUpdateHandler — closure care este apelat la fiecare modificare a stării căii de rețea.
  • NWPathMonitor suportă filtrarea după tipul de interfață necesar prin parametrul requiredInterfaceType.

Ce este NWPathMonitor?

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.

Istoria apariției framework-ului Network

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.

Cum să utilizați NWPathMonitor în aplicaț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.

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("Rețea disponibilă")
            } else {
                print("Rețea indisponibilă")
            }
        }
        monitor.start(on: queue)
    }

    func stopMonitoring() {
        monitor.cancel()
    }
}

Lucrul cu tipul de interfață

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ă.

Ciclul de viață al monitorizării

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.

Proprietăți și capacități ale NWPath

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).

ProprietateTipDescriere
statusNWPath.StatusStarea 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
isExpensiveBoolTrue dacă conexiunea este tarifată (date mobile, hotspot personal)
isConstrainedBoolTrue dacă conexiunea este limitată ca viteză (modul Low Data)

Verificarea costurilor și limitărilor

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.

Exemple de implementare NWPathMonitor

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.

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
    }
}

Gestionarea pierderii rețelei cu acțiune întârziată

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.

NWPathMonitor vs Reachability

Î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ăNWPathMonitorReachability
Versiune minimăiOS 12iOS 2
LimbajSwift (Network)C (SystemConfiguration)
Tipuri de interfețeWi-Fi, Cellular, Ethernet, VPNWi-Fi, WWAN (general)
isExpensiveDaNu
AsincronitateGCD (dispatch queue)RunLoop
Interfețe multipleDa (multipath)Nu

Când să utilizați Reachability

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

Care este versiunea minimă de iOS necesară pentru NWPathMonitor?

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.

Care este diferența dintre NWPath.Status.satisfied și unsatisfied?

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.

Cum se determină tipul rețelei — Wi-Fi sau mobilă?

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.

Trebuie anulat NWPathMonitor la trecerea în fundal?

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.

Cum se gestionează portalele captive cu NWPathMonitor?

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

  • NWPathMonitor — o clasă a framework-ului Network pentru monitorizarea căii de rețea în iOS 12+ cu suport pentru GCD și Combine.
  • NWPath conține informații complete despre conexiune: status, tipuri de interfețe, costuri, limitări și gateway-uri.
  • Metoda start pornește monitorizarea pe coada specificată, pathUpdateHandler primește actualizări NWPath.
  • Proprietățile isExpensive și isConstrained permit determinarea conexiunilor tarifate și limitate.
  • NWPathMonitor a înlocuit Reachability pentru iOS 12+, oferind un API mai bogat în Swift.
  • Filtrarea după tipul interfeței se implementează prin inițializatorul cu parametrul requiredInterfaceType.
  • Pentru lucrul în fundal monitorizarea trebuie întreruptă și reluată la trecerea între foreground și background.

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.

Discutați proiectul

Citiți și