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 — 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.
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.
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.
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()
}
}
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.
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ą.
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ść | Typ | Opis |
|---|---|---|
| status | NWPath.Status | Bieżący stan ścieżki: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Lista wszystkich dostępnych interfejsów sieciowych |
| gateways | [NWEndpoint] | Lista bram używanych do routingu |
| isExpensive | Bool | True, jeśli połączenie jest taryfikowane (dane komórkowe, osobisty hotspot) |
| isConstrained | Bool | True, jeśli połączenie jest ograniczone prędkościowo (tryb niskiego transferu danych) |
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.
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.
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
}
}
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.
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.
| Cecha | NWPathMonitor | Reachability |
|---|---|---|
| Minimalna wersja | iOS 12 | iOS 2 |
| Język | Swift (Network) | C (SystemConfiguration) |
| Typy interfejsów | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (ogólny) |
| isExpensive | Tak | Nie |
| Asynchroniczność | GCD (dispatch queue) | RunLoop |
| Wiele interfejsów | Tak (multipath) | Nie |
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
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.
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.
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.
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.
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
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.
Przeczytaj również