NWPathMonitor: co to jest, śledzenie sieci i praca w iOS

Autor: IT Sectr Opublikowano: 2026-03-10 Czas czytania: 9 min

NWPathMonitor — klasa z frameworka Network w iOS i macOS do monitorowania stanu ścieżki sieciowej urządzenia. Według Apple Developer Documentation (2025), NWPathMonitor pozwala aplikacji śledzić dostępność sieci, określać typ interfejsu i reagować na zmiany połączenia. NWPathMonitor dostarcza informacji o typie połączenia, kosztach ruchu i dostępności internetu poprzez wygodny callback z NWPath.

Najważniejsze

  • NWPathMonitor — klasa frameworka Network do asynchronicznego monitorowania ścieżki sieciowej w iOS i macOS.
  • NWPath zawiera informacje o dostępności sieci, typie interfejsu (Wi-Fi, dane komórkowe, Ethernet) i statusie kosztów.
  • Metoda start uruchamia monitorowanie na wskazanej kolejce dispatch queue, metoda cancel — zatrzymuje.
  • Właściwość pathUpdateHandler — closure, który jest wywoływany przy każdej zmianie stanu ścieżki sieciowej.
  • NWPathMonitor obsługuje filtrowanie według wymaganego typu interfejsu poprzez parametr requiredInterfaceType.

Czym jest NWPathMonitor?

NWPathMonitor — to klasa z frameworka Network, wprowadzona przez Apple w iOS 12 i macOS 10.14 Mojave. Zapewnia nowoczesne API do śledzenia zmian ścieżki sieciowej urządzenia — kombinacji interfejsów sieciowych, przez które przechodzi ruch aplikacji.

Przed iOS 12 do monitorowania sieci używano biblioteki Reachability, zbudowanej na C-frameworku SystemConfiguration. NWPathMonitor jest natywną alternatywą Swift z bogatszym API, obsługą nowoczesnych typów połączeń (VPN, multipath, LTE, 5G) i wbudowaną pracą z GCD.

Kluczowa różnica między NWPathMonitor a Reachability — obiekt NWPath dostarcza nie tylko binarny status „dostępne/niedostępne”, ale pełny obraz ścieżki: używane interfejsy, ich priorytet, koszty, status roamingu i możliwość proxy i VPN. Deweloper otrzymuje wyczerpujące informacje do podejmowania decyzji o żądaniach sieciowych.

Historia powstania frameworka Network

Framework Network pojawił się jako nowoczesny zamiennik niskopoziomowych C-API — CFStream i BSD Sockets. Zapewnia jednolity interfejs do komunikacji sieciowej na wszystkich platformach Apple, w tym watchOS i tvOS. NWPathMonitor jest częścią tego frameworka obok NWConnection, NWListener i NWBrowser.

Framework Network został napisany w Swift i używa GCD do asynchronicznego przetwarzania. Oznacza to, że callbacki NWPathMonitor są wykonywane na wskazanej dispatch queue, integrując się z istniejącą architekturą wielowątkowości aplikacji bez ręcznego zarządzania wątkami.

Jak używać NWPathMonitor w aplikacji

Użycie NWPathMonitor rozpoczyna się od utworzenia instancji klasy i skonfigurowania handlera pathUpdateHandler. Następnie wywoływana jest metoda start z wskazaniem dispatch queue, na której będzie wykonywany closure. Zatrzymanie monitorowania wykonuje się metodą cancel, która również zwalnia zasoby.

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("Sieć dostępna")
            } else {
                print("Sieć niedostępna")
            }
        }
        monitor.start(on: queue)
    }

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

Praca z typem interfejsu

NWPathMonitor można skonfigurować do śledzenia tylko określonego typu interfejsu. Służy do tego inicjalizator NWPathMonitor(requiredInterfaceType:) z parametrem NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet lub .loopback. Jeśli typ nie jest określony, monitorowanie odbywa się dla wszystkich interfejsów.

Praktyczny przykład: aplikacja do streamingu może śledzić tylko Wi-Fi i ostrzegać użytkownika o przejściu na dane komórkowe. Sprawdzanie isConstrained i isExpensive w NWPath pozwala określić, czy bieżące połączenie jest taryfikowane lub ograniczone pod względem prędkości.

Cykl życia monitorowania

Monitorowanie powinno być uruchamiane przy starcie aplikacji lub po przejściu na pierwszy plan i zatrzymywane przy przejściu w tło. Zaleca się tworzenie jednej instancji NWPathMonitor na całą aplikację (singleton) i używanie jej z różnych modułów poprzez protokół lub warstwę serwisową.

Właściwości i możliwości NWPath

NWPath — obiekt przekazywany do pathUpdateHandler, który opisuje bieżący stan ścieżki sieciowej. Zawiera pięć kluczowych właściwości, które pokrywają większość scenariuszy monitorowania sieci. NWPath.Status — wyliczenie z trzema stanami: satisfied (dostępny), unsatisfied (niedostępny) i requiresConnection (wymaga połączenia).

WłaściwośćTypOpis
statusNWPath.StatusBieżący stan ścieżki: satisfied, unsatisfied, requiresConnection
availableInterfaces[NWInterface]Lista wszystkich dostępnych interfejsów sieciowych
gateways[NWEndpoint]Lista bram używanych do routingu
isExpensiveBoolTrue, jeśli połączenie jest taryfikowane (dane komórkowe, osobisty hotspot)
isConstrainedBoolTrue, jeśli połączenie jest ograniczone prędkościowo (tryb niskiego transferu danych)

Sprawdzanie kosztów i ograniczeń

Właściwość isExpensive — krytycznie ważna flaga dla aplikacji pracujących z dużą ilością danych. Jeśli isExpensive = true, aplikacja powinna obniżyć jakość streamingu, odłożyć pobieranie aktualizacji lub ostrzec użytkownika. isConstrained wskazuje na włączony tryb Low Data Mode.

Do sprawdzenia dostępności internetu (nie tylko sieci) używa się metody usesInterfaceType. Jeśli urządzenie jest podłączone do Wi-Fi bez internetu — NWPath może pokazywać satisfied, ale faktyczny dostęp jest nieobecny. W takich przypadkach wymagana jest dodatkowa walidacja przez NWConnection.

Przykłady implementacji NWPathMonitor

Rozważmy zaawansowaną implementację NWPathMonitor z obsługą kosztów, typów interfejsu i powiadamianiem ViewModel przez publisher. W przykładzie użyto Combine framework do reaktywnej aktualizacji UI przy zmianie stanu sieci.

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

Obsługa utraty sieci z odroczonym działaniem

Przy utracie połączenia może być wymagane nie tylko powiadomienie UI, ale także wykonanie odroczonych działań — na przykład zapisanie szkicu żądania do późniejszego wysłania. Zaimplementuj kolejkę odroczonych żądań, która gromadzi operacje przy statusie unsatisfied i wysyła je po przywróceniu satisfied.

Do tego zadania idealnie nadaje się wzorzec ReachabilityManager z delegatem: NWPathMonitor powiadamia menedżera, menedżer aktualizuje kolejkę i UI. Przy zmianie statusu na satisfied kolejka automatycznie się opróżnia, a UI otrzymuje informację o przywróceniu połączenia.

NWPathMonitor vs Reachability

Przed pojawieniem się NWPathMonitor standardowym rozwiązaniem do monitorowania sieci w iOS była biblioteka Reachability od Apple (przykład z dokumentacji), zbudowana na SystemConfiguration. Główne różnice: Reachability działa przez SCNetworkReachability w C, nie obsługuje nowoczesnych typów sieci i daje tylko binarną odpowiedź o dostępności.

NWPathMonitor rozwiązuje te ograniczenia: jest napisany w Swift, obsługuje VPN, multipath, 5G i LTE, dostarcza szczegółowych informacji o każdym interfejsie i działa asynchronicznie przez GCD. Reachability jest nadal używane w projektach z minimalnym wsparciem iOS 11 i starszych.

CechaNWPathMonitorReachability
Minimalna wersjaiOS 12iOS 2
JęzykSwift (Network)C (SystemConfiguration)
Typy interfejsówWi-Fi, Cellular, Ethernet, VPNWi-Fi, WWAN (ogólny)
isExpensiveTakNie
AsynchronicznośćGCD (dispatch queue)RunLoop
Wiele interfejsówTak (multipath)Nie

Kiedy używać Reachability

Jeśli twoja aplikacja wspiera iOS 11 i starsze, Reachability pozostaje jedyną opcją. Dla projektów iOS 12+ zaleca się natychmiastowe użycie NWPathMonitor — lepiej integruje się z nowoczesnym kodem Swift, Combine i SwiftUI.

Migracja z Reachability na NWPathMonitor jest prosta: wystarczy zastąpić wywołania SCNetworkReachability na NWPathMonitor, zachowując tę samą logikę przetwarzania. Warstwa abstrakcji (protokół NetworkMonitorProtocol) pozwoli przełączać się między implementacjami bez zmiany logiki biznesowej aplikacji.

Często zadawane pytania

Jaka jest minimalna wersja iOS wymagana dla NWPathMonitor?

NWPathMonitor jest dostępny od iOS 12.0, macOS 10.14, watchOS 5.0 i tvOS 12.0. Dla projektów wspierających starsze wersje używaj Reachability z SystemConfiguration lub bibliotek opakowujących z kompilacją warunkową przez #available.

Czym różni się NWPath.Status.satisfied od unsatisfied?

Satisfied oznacza, że ruch może przechodzić przez co najmniej jeden interfejs. Unsatisfied — żaden interfejs nie jest dostępny. Stan requiresConnection — ścieżka wymaga nawiązania połączenia (np. VPN nie jest podłączony), a ruch tymczasowo nie przechodzi.

Jak określić typ sieci — Wi-Fi czy komórkowa?

Użyj metody usesInterfaceType na NWPath: path.usesInterfaceType(.wifi) dla Wi-Fi, path.usesInterfaceType(.cellular) dla danych komórkowych. Metoda zwraca true, jeśli bieżący ruch przechodzi przez określony typ interfejsu.

Czy trzeba anulować NWPathMonitor przy przejściu w tło?

Zaleca się wstrzymanie monitorowania w tle w celu oszczędzania baterii. Wywołanie monitor.cancel() w applicationDidEnterBackground i ponowny start w applicationWillEnterForeground zmniejszają zużycie energii. Dla krytycznych operacji używaj Background Task.

Jak obsługiwać portale captive z NWPathMonitor?

NWPathMonitor może pokazywać satisfied nawet przy portalu captive. Aby określić rzeczywisty dostęp do internetu, wykonaj żądanie HTTP do trusted endpoint przez NWConnection. Jeśli pojawi się redirect — portal jest aktywny, wymagana jest autoryzacja w WebView.

Podsumowanie

  • NWPathMonitor — klasa frameworka Network do monitorowania ścieżki sieciowej w iOS 12+ z obsługą GCD i Combine.
  • NWPath zawiera pełne informacje o połączeniu: status, typy interfejsów, koszty, ograniczenia i bramy.
  • Metoda start uruchamia monitorowanie na wskazanej kolejce, pathUpdateHandler otrzymuje aktualizacje NWPath.
  • Właściwości isExpensive i isConstrained pozwalają określać taryfikowane i ograniczone połączenia.
  • NWPathMonitor zastąpił Reachability dla iOS 12+, dostarczając bogatsze API w Swift.
  • Filtrowanie według typu interfejsu realizuje się przez inicjalizator z parametrem requiredInterfaceType.
  • Do pracy w tle monitorowanie należy wstrzymywać i wznawiać przy przejściu między foreground a background.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również