NWPathMonitor ist eine Klasse aus dem Network-Framework in iOS und macOS zur Überwachung des Zustands des Netzwerkpfads eines Geräts. Laut Apple Developer Documentation (2025) ermöglicht NWPathMonitor der Anwendung, die Netzwerkverfügbarkeit zu verfolgen, den Schnittstellentyp zu bestimmen und auf Verbindungsänderungen zu reagieren. NWPathMonitor bietet Informationen über den Verbindungstyp, Datenkosten und Internetverfügbarkeit über einen praktischen Callback mit NWPath.
Wichtige Punkte
NWPathMonitor ist eine Klasse aus dem Network-Framework, die von Apple in iOS 12 und macOS 10.14 Mojave eingeführt wurde. Sie bietet eine moderne API zur Verfolgung von Änderungen im Netzwerkpfad eines Geräts — der Kombination von Netzwerkschnittstellen, durch die der Datenverkehr der Anwendung fließt.
Vor iOS 12 wurde die Reachability-Bibliothek verwendet, die auf dem C-basierten SystemConfiguration-Framework aufbaute. NWPathMonitor ist eine native Swift-Alternative mit einer reichhaltigeren API, Unterstützung für moderne Verbindungstypen (VPN, Multipath, LTE, 5G) und integrierter GCD-Integration.
Der Hauptunterschied zwischen NWPathMonitor und Reachability — das NWPath-Objekt bietet nicht nur einen binären Status „verfügbar/nicht verfügbar“, sondern ein vollständiges Bild des Pfads: verwendete Schnittstellen, deren Priorität, Kosten, Roaming-Status und Proxy- und VPN-Fähigkeiten. Der Entwickler erhält umfassende Informationen für Entscheidungen über Netzwerkanfragen.
Das Network-Framework entstand als moderner Ersatz für niedrige C-APIs — CFStream und BSD Sockets. Es bietet eine einheitliche Schnittstelle für die Netzwerkkommunikation auf allen Apple-Plattformen, einschließlich watchOS und tvOS. NWPathMonitor ist Teil dieses Frameworks neben NWConnection, NWListener und NWBrowser.
Das Network-Framework ist in Swift geschrieben und verwendet GCD für asynchrone Verarbeitung. Das bedeutet, dass NWPathMonitor-Callbacks auf der angegebenen Dispatch Queue ausgeführt werden und sich in die vorhandene Multithreading-Architektur der Anwendung integrieren, ohne manuelles Thread-Management.
Die Verwendung von NWPathMonitor beginnt mit der Erstellung einer Klasseninstanz und der Konfiguration des pathUpdateHandler-Callbacks. Dann wird die start-Methode mit einer Dispatch Queue aufgerufen, in der der Closure ausgeführt wird. Die Überwachung wird durch die cancel-Methode gestoppt, die auch Ressourcen freigibt.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Netzwerk verfügbar")
} else {
print("Netzwerk nicht verfügbar")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor kann so konfiguriert werden, dass nur ein bestimmter Schnittstellentyp überwacht wird. Verwenden Sie den Initialisierer NWPathMonitor(requiredInterfaceType:) mit dem Parameter NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet oder .loopback. Wenn kein Typ angegeben ist, deckt die Überwachung alle Schnittstellen ab.
Praktisches Beispiel: Eine Streaming-Anwendung kann nur Wi-Fi überwachen und den Benutzer warnen, wenn auf Mobilfunkdaten umgeschaltet wird. Die Überprüfung von isConstrained und isExpensive in NWPath ermöglicht die Feststellung, ob die aktuelle Verbindung gebührenpflichtig oder geschwindigkeitsbegrenzt ist.
Die Überwachung sollte beim Start der Anwendung oder beim Wechsel in den Vordergrund beginnen und beim Wechsel in den Hintergrund gestoppt werden. Es wird empfohlen, eine einzige NWPathMonitor-Instanz für die gesamte Anwendung (Singleton) zu erstellen und sie über ein Protokoll oder eine Dienstschicht in verschiedenen Modulen zu verwenden.
NWPath ist ein Objekt, das an pathUpdateHandler übergeben wird und den aktuellen Zustand des Netzwerkpfads beschreibt. Es enthält fünf Schlüsseleigenschaften, die die meisten Netzwerküberwachungsszenarien abdecken. NWPath.Status — eine Aufzählung mit drei Zuständen: satisfied (verfügbar), unsatisfied (nicht verfügbar) und requiresConnection (benötigt Verbindung).
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| status | NWPath.Status | Aktueller Pfadstatus: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Liste aller verfügbaren Netzwerkschnittstellen |
| gateways | [NWEndpoint] | Liste der für das Routing verwendeten Gateways |
| isExpensive | Bool | True, wenn die Verbindung gebührenpflichtig ist (Mobilfunkdaten, persönlicher Hotspot) |
| isConstrained | Bool | True, wenn die Verbindung geschwindigkeitsbegrenzt ist (Low Data Mode) |
Die Eigenschaft isExpensive ist ein kritisches Flag für Anwendungen, die mit großen Datenmengen arbeiten. Wenn isExpensive = true ist, sollte die Anwendung die Streaming-Qualität reduzieren, Update-Downloads verschieben oder den Benutzer warnen. isConstrained zeigt an, dass der Low Data Mode aktiviert ist.
Um die Internetverfügbarkeit (nicht nur das Netzwerk) zu überprüfen, verwenden Sie die Methode usesInterfaceType. Wenn das Gerät ohne Internet mit Wi-Fi verbunden ist — kann NWPath satisfied anzeigen, aber der tatsächliche Zugriff fehlt. In solchen Fällen ist eine zusätzliche Validierung über NWConnection erforderlich.
Betrachten wir eine erweiterte NWPathMonitor-Implementierung mit Kostenverwaltung, Schnittstellentypen und ViewModel-Benachrichtigung über einen Publisher. Das Beispiel verwendet das Combine-Framework für reaktive UI-Updates bei Änderungen des Netzwerkstatus.
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
}
}
Wenn eine Verbindung verloren geht, kann es erforderlich sein, nicht nur die UI zu benachrichtigen, sondern auch verzögerte Aktionen durchzuführen — zum Beispiel einen Anfrageentwurf für den späteren Versand zu speichern. Implementieren Sie eine Warteschlange für verzögerte Anfragen, die Operationen während des unsatisfied-Status sammelt und sendet, wenn satisfied wiederhergestellt ist.
Das ReachabilityManager mit Delegate-Muster ist ideal für diese Aufgabe: NWPathMonitor benachrichtigt den Manager, der Manager aktualisiert die Warteschlange und die UI. Wenn sich der Status auf satisfied ändert, wird die Warteschlange automatisch geleert und die UI erhält eine Anzeige der Verbindungswiederherstellung.
Vor NWPathMonitor war die Standardlösung für die Netzwerküberwachung in iOS die Reachability-Bibliothek von Apple (Beispiel aus der Dokumentation), die auf SystemConfiguration aufbaute. Die Hauptunterschiede: Reachability arbeitet über SCNetworkReachability in C, unterstützt keine modernen Netzwerktypen und liefert nur eine binäre Verfügbarkeitsantwort.
NWPathMonitor behebt diese Einschränkungen: Es ist in Swift geschrieben, unterstützt VPN, Multipath, 5G und LTE, bietet detaillierte Informationen über jede Schnittstelle und arbeitet asynchron über GCD. Reachability wird weiterhin in Projekten mit minimaler iOS 11 und niedrigerer Unterstützung verwendet.
| Merkmal | NWPathMonitor | Reachability |
|---|---|---|
| Mindestversion | iOS 12 | iOS 2 |
| Sprache | Swift (Network) | C (SystemConfiguration) |
| Schnittstellentypen | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (allgemein) |
| isExpensive | Ja | Nein |
| Asynchron | GCD (dispatch queue) | RunLoop |
| Mehrere Schnittstellen | Ja (Multipath) | Nein |
Wenn Ihre Anwendung iOS 11 und niedriger unterstützt, bleibt Reachability die einzige Option. Für iOS 12+ Projekte wird empfohlen, NWPathMonitor direkt zu verwenden — es integriert sich besser mit modernem Swift-Code, Combine und SwiftUI.
Die Migration von Reachability zu NWPathMonitor ist einfach: Ersetzen Sie einfach SCNetworkReachability-Aufrufe durch NWPathMonitor, wobei Sie dieselbe Verarbeitungslogik beibehalten. Eine Abstraktionsschicht (NetworkMonitorProtocol) ermöglicht das Wechseln zwischen Implementierungen, ohne die Geschäftslogik der Anwendung zu ändern.
Häufig gestellte Fragen
NWPathMonitor ist verfügbar ab iOS 12.0, macOS 10.14, watchOS 5.0 und tvOS 12.0. Für Projekte, die ältere Versionen unterstützen, verwenden Sie Reachability aus SystemConfiguration oder Wrapper-Bibliotheken mit bedingter Kompilierung über #available.
Satisfied bedeutet, dass Datenverkehr über mindestens eine Schnittstelle fließen kann. Unsatisfied — keine Schnittstelle ist verfügbar. Der Zustand requiresConnection — der Pfad muss eine Verbindung herstellen (z.B. VPN ist nicht verbunden), und Datenverkehr kann vorübergehend nicht passieren.
Verwenden Sie die Methode usesInterfaceType auf NWPath: path.usesInterfaceType(.wifi) für Wi-Fi, path.usesInterfaceType(.cellular) für Mobilfunkdaten. Die Methode gibt true zurück, wenn der aktuelle Datenverkehr über den angegebenen Schnittstellentyp läuft.
Es wird empfohlen, die Überwachung im Hintergrund zu pausieren, um Akku zu sparen. Der Aufruf von monitor.cancel() in applicationDidEnterBackground und der Neustart von start in applicationWillEnterForeground reduzieren den Stromverbrauch. Verwenden Sie Background Task für kritische Vorgänge.
NWPathMonitor kann auch bei einem captive Portal satisfied anzeigen. Um den tatsächlichen Internetzugriff zu bestimmen, führen Sie eine HTTP-Anfrage an einen vertrauenswürdigen Endpunkt über NWConnection durch. Wenn eine Weiterleitung erfolgt — ist das Portal aktiv und erfordert eine Autorisierung in einem WebView.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch