NWPathMonitor — třída z frameworku Network v iOS a macOS pro monitorování stavu síťové cesty zařízení. Podle Apple Developer Documentation (2025) umožňuje NWPathMonitor aplikaci sledovat dostupnost sítě, určovat typ rozhraní a reagovat na změny připojení. NWPathMonitor poskytuje informace o typu připojení, nákladech na provoz a dostupnosti internetu prostřednictvím pohodlného callbacku s NWPath.
Hlavní body
NWPathMonitor — je třída z frameworku Network, představená společností Apple v iOS 12 a macOS 10.14 Mojave. Poskytuje moderní API pro sledování změn síťové cesty zařízení — kombinace síťových rozhraní, kterými prochází provoz aplikace.
Před iOS 12 se pro monitorování sítě používala knihovna Reachability, postavená na C-frameworku SystemConfiguration. NWPathMonitor je nativní Swift alternativa s bohatším API, podporou moderních typů připojení (VPN, multipath, LTE, 5G) a vestavěnou prací s GCD.
Klíčový rozdíl mezi NWPathMonitor a Reachability — objekt NWPath poskytuje nejen binární stav „dostupné/nedostupné“, ale úplný obraz cesty: použitá rozhraní, jejich prioritu, náklady, stav roamingu a možnost proxy a VPN. Vývojář získává vyčerpávající informace pro rozhodování o síťových požadavcích.
Framework Network se objevil jako moderní náhrada za nízkoúrovňová C-API — CFStream a BSD Sockets. Poskytuje jednotné rozhraní pro síťovou komunikaci na všech platformách Apple, včetně watchOS a tvOS. NWPathMonitor je součástí tohoto frameworku vedle NWConnection, NWListener a NWBrowser.
Framework Network je napsán v Swiftu a používá GCD pro asynchronní zpracování. To znamená, že callbacky NWPathMonitor jsou prováděny na zadané frontě dispatch queue, integrujíce se se stávající vícevláknovou architekturou aplikace bez ruční správy vláken.
Použití NWPathMonitor začíná vytvořením instance třídy a konfigurací handleru pathUpdateHandler. Poté je volána metoda start s určením fronty dispatch queue, na které bude closure prováděn. Zastavení monitorování se provádí metodou cancel, která také uvolňuje prostředky.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Síť dostupná")
} else {
print("Síť nedostupná")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor lze nakonfigurovat tak, aby sledoval pouze určitý typ rozhraní. K tomu slouží inicializátor NWPathMonitor(requiredInterfaceType:) s parametrem NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet nebo .loopback. Pokud typ není uveden, monitorování probíhá pro všechna rozhraní.
Praktický příklad: aplikace pro streamování může sledovat pouze Wi-Fi a upozornit uživatele při přechodu na mobilní data. Kontrola isConstrained a isExpensive v NWPath umožňuje určit, zda je aktuální připojení zpoplatněno nebo omezeno rychlostí.
Monitorování by mělo být spuštěno při startu aplikace nebo při přechodu do popředí a zastaveno při přechodu do pozadí. Doporučuje se vytvořit jednu instanci NWPathMonitor pro celou aplikaci (singleton) a používat ji z různých modulů prostřednictvím protokolu nebo servisní vrstvy.
NWPath — objekt předávaný do pathUpdateHandler, který popisuje aktuální stav síťové cesty. Obsahuje pět klíčových vlastností, které pokrývají většinu scénářů monitorování sítě. NWPath.Status — výčet se třemi stavy: satisfied (dostupný), unsatisfied (nedostupný) a requiresConnection (vyžaduje připojení).
| Vlastnost | Typ | Popis |
|---|---|---|
| status | NWPath.Status | Aktuální stav cesty: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Seznam všech dostupných síťových rozhraní |
| gateways | [NWEndpoint] | Seznam bran používaných pro směrování |
| isExpensive | Bool | True, pokud je připojení zpoplatněno (mobilní data, osobní hotspot) |
| isConstrained | Bool | True, pokud je připojení omezeno rychlostí (režim nízkých dat) |
Vlastnost isExpensive — kriticky důležitý příznak pro aplikace pracující s velkým objemem dat. Pokud je isExpensive = true, aplikace by měla snížit kvalitu streamování, odložit stahování aktualizací nebo upozornit uživatele. isConstrained indikuje zapnutý režim Low Data Mode.
Pro kontrolu dostupnosti internetu (nejen sítě) se používá metoda usesInterfaceType. Pokud je zařízení připojeno k Wi-Fi bez internetu — NWPath může zobrazovat satisfied, ale skutečný přístup chybí. V takových případech je vyžadována dodatečná validace prostřednictvím NWConnection.
Podívejme se na pokročilou implementaci NWPathMonitor se zpracováním nákladů, typů rozhraní a notifikací ViewModel pomocí publisheru. V příkladu je použit Combine framework pro reaktivní aktualizaci UI při změně stavu sítě.
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
}
}
Při ztrátě připojení může být vyžadováno nejen upozornění UI, ale také provedení odložených akcí — například uložení konceptu požadavku pro pozdější odeslání. Implementujte frontu odložených požadavků, která shromažďuje operace při stavu unsatisfied a odesílá je při obnovení satisfied.
Pro tento úkol se ideálně hodí vzor ReachabilityManager s delegátem: NWPathMonitor upozorní manažera, manažer aktualizuje frontu a UI. Při změně stavu na satisfied se fronta automaticky vyprázdní a UI obdrží indikaci obnovení připojení.
Před příchodem NWPathMonitor bylo standardním řešením pro monitorování sítě v iOS knihovna Reachability od Apple (příklad z dokumentace), postavená na SystemConfiguration. Hlavní rozdíly: Reachability funguje přes SCNetworkReachability v C, nepodporuje moderní typy sítí a poskytuje pouze binární odpověď o dostupnosti.
NWPathMonitor tyto omezení řeší: je napsán v Swiftu, podporuje VPN, multipath, 5G a LTE, poskytuje detailní informace o každém rozhraní a pracuje asynchronně přes GCD. Reachability se stále používá v projektech s minimální podporou iOS 11 a nižších.
| Vlastnost | NWPathMonitor | Reachability |
|---|---|---|
| Minimální verze | iOS 12 | iOS 2 |
| Jazyk | Swift (Network) | C (SystemConfiguration) |
| Typy rozhraní | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (obecný) |
| isExpensive | Ano | Ne |
| Asynchronnost | GCD (dispatch queue) | RunLoop |
| Vícenásobná rozhraní | Ano (multipath) | Ne |
Pokud vaše aplikace podporuje iOS 11 a nižší, Reachability zůstává jedinou možností. Pro projekty iOS 12+ se doporučuje okamžitě používat NWPathMonitor — lépe se integruje s moderním Swift kódem, Combine a SwiftUI.
Migrace z Reachability na NWPathMonitor je jednoduchá: stačí nahradit volání SCNetworkReachability na NWPathMonitor, při zachování stejné logiky zpracování. Vrstva abstrakce (protokol NetworkMonitorProtocol) umožní přepínání mezi implementacemi bez změny obchodní logiky aplikace.
Často kladené otázky
NWPathMonitor je dostupný od iOS 12.0, macOS 10.14, watchOS 5.0 a tvOS 12.0. Pro projekty podporující starší verze použijte Reachability z SystemConfiguration nebo knihovny obálky s podmíněnou kompilací přes #available.
Satisfied znamená, že provoz může procházet přes alespoň jedno rozhraní. Unsatisfied — žádné rozhraní není dostupné. Stav requiresConnection — cesta vyžaduje navázání připojení (např. VPN není připojena) a provoz dočasně neprochází.
Použijte metodu usesInterfaceType na NWPath: path.usesInterfaceType(.wifi) pro Wi-Fi, path.usesInterfaceType(.cellular) pro mobilní data. Metoda vrací true, pokud aktuální provoz prochází přes zadaný typ rozhraní.
Doporučuje se pozastavit monitorování na pozadí pro úsporu baterie. Volání monitor.cancel() v applicationDidEnterBackground a opětovné spuštění v applicationWillEnterForeground snižuje spotřebu energie. Pro kritické operace použijte Background Task.
NWPathMonitor může zobrazovat satisfied i u captive portálu. Pro určení skutečného přístupu k internetu proveďte HTTP požadavek na důvěryhodný endpoint přes NWConnection. Pokud přijde přesměrování — portál je aktivní, je vyžadována autorizace v WebView.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také