NWPathMonitor — een klasse uit het Network-framework in iOS en macOS voor het bewaken van de netwerkpadstatus van het apparaat. Volgens Apple Developer Documentation (2025) stelt NWPathMonitor de app in staat om de netwerkbeschikbaarheid te volgen, het interfacetype te bepalen en te reageren op verbindingswijzigingen. NWPathMonitor biedt informatie over het verbindingstype, verkeerskosten en internetbeschikbaarheid via een handige callback met NWPath.
Belangrijkste punten
NWPathMonitor — is een klasse uit het Network-framework, geïntroduceerd door Apple in iOS 12 en macOS 10.14 Mojave. Het biedt een moderne API voor het volgen van wijzigingen in het netwerkpad van het apparaat — de combinatie van netwerkinterfaces waar het verkeer van de app doorheen gaat.
Vóór iOS 12 werd voor netwerkmonitoring de bibliotheek Reachability gebruikt, gebouwd op het C-framework SystemConfiguration. NWPathMonitor is een native Swift-alternatief met een rijkere API, ondersteuning voor moderne verbindingstypen (VPN, multipath, LTE, 5G) en ingebouwde integratie met GCD.
Het belangrijkste verschil tussen NWPathMonitor en Reachability — het NWPath-object biedt niet alleen een binaire status „beschikbaar/niet beschikbaar“, maar een volledig beeld van het pad: gebruikte interfaces, hun prioriteit, kosten, roamingstatus en de mogelijkheid van proxy en VPN. De ontwikkelaar krijgt uitgebreide informatie om beslissingen te nemen over netwerkverzoeken.
Het Network-framework is ontstaan als moderne vervanging van laagwaardige C-API's — CFStream en BSD Sockets. Het biedt een uniforme interface voor netwerkcommunicatie op alle Apple-platforms, inclusief watchOS en tvOS. NWPathMonitor maakt deel uit van dit framework naast NWConnection, NWListener en NWBrowser.
Het Network-framework is geschreven in Swift en gebruikt GCD voor asynchrone verwerking. Dit betekent dat de callbacks van NWPathMonitor worden uitgevoerd op de opgegeven dispatch queue, waardoor ze integreren met de bestaande multi-threading architectuur van de app zonder handmatig threadbeheer.
Het gebruik van NWPathMonitor begint met het maken van een instantie van de klasse en het configureren van de pathUpdateHandler. Vervolgens wordt de methode start aangeroepen met specificatie van de dispatch queue waarop de closure wordt uitgevoerd. Het stoppen van de monitoring gebeurt met de methode cancel, die ook bronnen vrijgeeft.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Netwerk beschikbaar")
} else {
print("Netwerk niet beschikbaar")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor kan worden geconfigureerd om alleen een specifiek interfacetype te volgen. Hiervoor wordt de initialisator NWPathMonitor(requiredInterfaceType:) gebruikt met de parameter NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet of .loopback. Als het type niet is opgegeven, wordt de monitoring voor alle interfaces uitgevoerd.
Praktisch voorbeeld: een streaming-app kan alleen Wi-Fi volgen en de gebruiker waarschuwen bij overschakeling naar mobiele data. Controle van isConstrained en isExpensive in NWPath maakt het mogelijk te bepalen of de huidige verbinding wordt getarifeerd of beperkt is in snelheid.
Monitoring moet worden gestart bij het opstarten van de app of bij het naar de voorgrond komen en worden gestopt bij het naar de achtergrond gaan. Het wordt aanbevolen om één instantie van NWPathMonitor voor de hele app (singleton) te maken en deze vanuit verschillende modules te gebruiken via een protocol of servicelaag.
NWPath — het object dat wordt doorgegeven aan pathUpdateHandler en de huidige status van het netwerkpad beschrijft. Het bevat vijf belangrijke eigenschappen die de meeste netwerkmonitoringscenario's dekken. NWPath.Status — een opsomming met drie toestanden: satisfied (beschikbaar), unsatisfied (niet beschikbaar) en requiresConnection (verbinding vereist).
| Eigenschap | Type | Beschrijving |
|---|---|---|
| status | NWPath.Status | Huidige padstatus: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Lijst van alle beschikbare netwerkinterfaces |
| gateways | [NWEndpoint] | Lijst van gateways die worden gebruikt voor routering |
| isExpensive | Bool | True als de verbinding wordt getarifeerd (mobiele data, persoonlijke hotspot) |
| isConstrained | Bool | True als de verbinding is beperkt in snelheid (Low Data Mode) |
De eigenschap isExpensive — een kritisch belangrijke vlag voor apps die met grote hoeveelheden data werken. Als isExpensive = true is, moet de app de streamingkwaliteit verlagen, het downloaden van updates uitstellen of de gebruiker waarschuwen. isConstrained geeft aan dat de Low Data Mode is ingeschakeld.
Voor het controleren van de internetbeschikbaarheid (niet alleen het netwerk) wordt de methode usesInterfaceType gebruikt. Als het apparaat is verbonden met Wi-Fi zonder internet — kan NWPath satisfied tonen, maar is er geen feitelijke toegang. In dergelijke gevallen is aanvullende validatie via NWConnection vereist.
Laten we een geavanceerde NWPathMonitor-implementatie bekijken met verwerking van kosten, interfacetypen en het melden van de ViewModel via een publisher. In het voorbeeld wordt Combine framework gebruikt voor reactieve UI-updates bij wijziging van de netwerkstatus.
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
}
}
Bij verlies van verbinding kan het nodig zijn niet alleen de UI te melden, maar ook uitgestelde acties uit te voeren — bijvoorbeeld een conceptverzoek opslaan voor latere verzending. Implementeer een wachtrij voor uitgestelde verzoeken die bewerkingen verzamelt bij de status unsatisfied en deze verzendt bij herstel van satisfied.
Voor deze taak is het patroon ReachabilityManager met delegate ideaal: NWPathMonitor meldt de manager, de manager werkt de wachtrij en UI bij. Bij wijziging van de status naar satisfied wordt de wachtrij automatisch geleegd en ontvangt de UI een indicatie van herstel van de verbinding.
Vóór de komst van NWPathMonitor was de standaardoplossing voor netwerkmonitoring in iOS de Reachability-bibliotheek van Apple (voorbeeld uit documentatie), gebouwd op SystemConfiguration. De belangrijkste verschillen: Reachability werkt via SCNetworkReachability in C, ondersteunt geen moderne netwerktypen en geeft alleen een binair antwoord over beschikbaarheid.
NWPathMonitor lost deze beperkingen op: het is geschreven in Swift, ondersteunt VPN, multipath, 5G en LTE, biedt gedetailleerde informatie over elke interface en werkt asynchroon via GCD. Reachability wordt nog steeds gebruikt in projecten met minimale ondersteuning voor iOS 11 en lager.
| Kenmerk | NWPathMonitor | Reachability |
|---|---|---|
| Minimale versie | iOS 12 | iOS 2 |
| Taal | Swift (Network) | C (SystemConfiguration) |
| Interfacetypen | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (algemeen) |
| isExpensive | Ja | Nee |
| Asynchroniteit | GCD (dispatch queue) | RunLoop |
| Meerdere interfaces | Ja (multipath) | Nee |
Als uw app iOS 11 en lager ondersteunt, blijft Reachability de enige optie. Voor iOS 12+ projecten wordt aanbevolen om direct NWPathMonitor te gebruiken — het integreert beter met moderne Swift-code, Combine en SwiftUI.
Migratie van Reachability naar NWPathMonitor is eenvoudig: vervang de SCNetworkReachability-aanroepen door NWPathMonitor en behoud dezelfde verwerkingslogica. Een abstractielaag (protocol NetworkMonitorProtocol) maakt het mogelijk om tussen implementaties te schakelen zonder de bedrijfslogica van de app te wijzigen.
Veelgestelde vragen
NWPathMonitor is beschikbaar vanaf iOS 12.0, macOS 10.14, watchOS 5.0 en tvOS 12.0. Voor projecten die oudere versies ondersteunen, gebruikt u Reachability uit SystemConfiguration of wrapper-bibliotheken met voorwaardelijke compilatie via #available.
Satisfied betekent dat verkeer door ten minste één interface kan gaan. Unsatisfied — geen enkele interface is beschikbaar. De status requiresConnection — het pad vereist het tot stand brengen van een verbinding (bijvoorbeeld VPN is niet verbonden) en verkeer gaat tijdelijk niet door.
Gebruik de methode usesInterfaceType op NWPath: path.usesInterfaceType(.wifi) voor Wi-Fi, path.usesInterfaceType(.cellular) voor mobiele data. De methode retourneert true als het huidige verkeer door het opgegeven interfacetype gaat.
Het wordt aanbevolen om de monitoring op de achtergrond te pauzeren om de batterij te sparen. Het aanroepen van monitor.cancel() in applicationDidEnterBackground en het opnieuw starten in applicationWillEnterForeground vermindert het energieverbruik. Gebruik Background Task voor kritieke bewerkingen.
NWPathMonitor kan satisfied tonen, zelfs bij een captive portal. Om de feitelijke internettoegang te bepalen, voert u een HTTP-verzoek naar een vertrouwd endpoint uit via NWConnection. Als er een redirect komt — is de portal actief en is autorisatie in WebView vereist.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook