NWPathMonitor est une classe du framework Network dans iOS et macOS pour surveiller l’état du chemin réseau de l’appareil. Selon Apple Developer Documentation (2025), NWPathMonitor permet à l’application de suivre la disponibilité du réseau, de déterminer le type d’interface et de réagir aux changements de connexion. NWPathMonitor fournit des informations sur le type de connexion, les coûts des données et la disponibilité Internet via un callback pratique avec NWPath.
Points clés
NWPathMonitor est une classe du framework Network introduite par Apple dans iOS 12 et macOS 10.14 Mojave. Elle fournit une API moderne pour suivre les changements dans le chemin réseau de l’appareil — la combinaison d’interfaces réseau à travers lesquelles le trafic de l’application transite.
Avant iOS 12, la bibliothèque Reachability construite sur le framework SystemConfiguration en C était utilisée pour la surveillance réseau. NWPathMonitor est une alternative native en Swift avec une API plus riche, une prise en charge des types de connexion modernes (VPN, multipath, LTE, 5G) et une intégration intégrée avec GCD.
La différence clé entre NWPathMonitor et Reachability — l’objet NWPath fournit non seulement un statut binaire « disponible/indisponible », mais une image complète du chemin : interfaces utilisées, leur priorité, coûts, statut d’itinérance et capacités proxy et VPN. Le développeur obtient des informations complètes pour prendre des décisions sur les requêtes réseau.
Le framework Network est apparu comme un remplacement moderne des API C de bas niveau — CFStream et BSD Sockets. Il fournit une interface unifiée pour la communication réseau sur toutes les plateformes Apple, y compris watchOS et tvOS. NWPathMonitor fait partie de ce framework aux côtés de NWConnection, NWListener et NWBrowser.
Le framework Network est écrit en Swift et utilise GCD pour le traitement asynchrone. Cela signifie que les callbacks de NWPathMonitor s’exécutent sur la dispatch queue spécifiée, s’intégrant à l’architecture de multithreading existante de l’application sans gestion manuelle des threads.
L’utilisation de NWPathMonitor commence par la création d’une instance de classe et la configuration du callback pathUpdateHandler. Ensuite, la méthode start est appelée avec une dispatch queue où la closure s’exécutera. La surveillance est arrêtée par la méthode cancel, qui libère également les ressources.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Réseau disponible")
} else {
print("Réseau indisponible")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor peut être configuré pour surveiller uniquement un type d’interface spécifique. Utilisez l’initialiseur NWPathMonitor(requiredInterfaceType:) avec le paramètre NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet ou .loopback. Si aucun type n’est spécifié, la surveillance couvre toutes les interfaces.
Exemple pratique : une application de streaming peut surveiller uniquement le Wi-Fi et avertir l’utilisateur du passage aux données cellulaires. Vérifier isConstrained et isExpensive dans NWPath permet de déterminer si la connexion actuelle est facturée ou limitée en vitesse.
La surveillance doit démarrer au lancement de l’application ou lors du passage au premier plan, et s’arrêter lors du passage en arrière-plan. Il est recommandé de créer une seule instance de NWPathMonitor pour toute l’application (singleton) et de l’utiliser depuis différents modules via un protocole ou une couche de service.
NWPath est un objet transmis à pathUpdateHandler qui décrit l’état actuel du chemin réseau. Il contient cinq propriétés clés couvrant la plupart des scénarios de surveillance réseau. NWPath.Status — une énumération avec trois états : satisfied (disponible), unsatisfied (indisponible) et requiresConnection (nécessite une connexion).
| Propriété | Type | Description |
|---|---|---|
| status | NWPath.Status | État actuel du chemin : satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Liste de toutes les interfaces réseau disponibles |
| gateways | [NWEndpoint] | Liste des passerelles utilisées pour le routage |
| isExpensive | Bool | True si la connexion est facturée (données cellulaires, hotspot personnel) |
| isConstrained | Bool | True si la connexion est limitée en vitesse (Low Data Mode) |
La propriété isExpensive est un indicateur critique pour les applications traitant de grands volumes de données. Si isExpensive = true, l’application doit réduire la qualité du streaming, reporter les téléchargements de mises à jour ou avertir l’utilisateur. isConstrained indique que le Low Data Mode est activé.
Pour vérifier la disponibilité Internet (pas seulement le réseau), utilisez la méthode usesInterfaceType. Si l’appareil est connecté au Wi-Fi sans Internet — NWPath peut afficher satisfied, mais l’accès réel est absent. Dans ces cas, une validation supplémentaire via NWConnection est nécessaire.
Examinons une implémentation avancée de NWPathMonitor avec gestion des coûts, types d’interface et notification ViewModel via un publisher. L’exemple utilise le framework Combine pour les mises à jour réactives de l’interface utilisateur lors des changements d’état du réseau.
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
}
}
Lorsque la connexion est perdue, il peut être nécessaire non seulement d’informer l’interface utilisateur, mais aussi d’effectuer des actions différées — par exemple, enregistrer un brouillon de requête pour un envoi ultérieur. Implémentez une file d’attente de requêtes différées qui accumule les opérations pendant le statut unsatisfied et les envoie lorsque satisfied est rétabli.
Le modèle ReachabilityManager avec délégation est idéal pour cette tâche : NWPathMonitor notifie le gestionnaire, le gestionnaire met à jour la file d’attente et l’interface utilisateur. Lorsque le statut passe à satisfied, la file d’attente se vide automatiquement et l’interface utilisateur reçoit une indication de restauration de la connexion.
Avant NWPathMonitor, la solution standard pour la surveillance réseau dans iOS était la bibliothèque Reachability d’Apple (exemple de la documentation), construite sur SystemConfiguration. Les principales différences : Reachability fonctionne via SCNetworkReachability en C, ne prend pas en charge les types de réseau modernes et fournit seulement une réponse binaire de disponibilité.
NWPathMonitor résout ces limitations : il est écrit en Swift, prend en charge VPN, multipath, 5G et LTE, fournit des informations détaillées sur chaque interface et fonctionne de manière asynchrone via GCD. Reachability est toujours utilisé dans les projets prenant en charge iOS 11 et inférieur.
| Caractéristique | NWPathMonitor | Reachability |
|---|---|---|
| Version minimale | iOS 12 | iOS 2 |
| Langage | Swift (Network) | C (SystemConfiguration) |
| Types d’interface | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (générique) |
| isExpensive | Oui | Non |
| Asynchrone | GCD (dispatch queue) | RunLoop |
| Interfaces multiples | Oui (multipath) | Non |
Si votre application prend en charge iOS 11 et inférieur, Reachability reste la seule option. Pour les projets iOS 12+, il est recommandé d’utiliser directement NWPathMonitor — il s’intègre mieux avec le code Swift moderne, Combine et SwiftUI.
La migration de Reachability vers NWPathMonitor est simple : il suffit de remplacer les appels SCNetworkReachability par NWPathMonitor, en conservant la même logique de traitement. Une couche d’abstraction (NetworkMonitorProtocol) permettra de basculer entre les implémentations sans modifier la logique métier de l’application.
Foire aux questions
NWPathMonitor est disponible à partir de iOS 12.0, macOS 10.14, watchOS 5.0 et tvOS 12.0. Pour les projets prenant en charge des versions plus anciennes, utilisez Reachability de SystemConfiguration ou des bibliothèques d’encapsulation avec compilation conditionnelle via #available.
Satisfied signifie que le trafic peut passer par au moins une interface. Unsatisfied — aucune interface n’est disponible. L’état requiresConnection — le chemin nécessite l’établissement d’une connexion (par exemple, VPN non connecté) et le trafic ne peut temporairement pas passer.
Utilisez la méthode usesInterfaceType sur NWPath : path.usesInterfaceType(.wifi) pour le Wi-Fi, path.usesInterfaceType(.cellular) pour les données cellulaires. La méthode renvoie true si le trafic actuel passe par le type d’interface spécifié.
Il est recommandé de suspendre la surveillance en arrière-plan pour économiser la batterie. L’appel de monitor.cancel() dans applicationDidEnterBackground et le redémarrage de start dans applicationWillEnterForeground réduisent la consommation d’énergie. Utilisez Background Task pour les opérations critiques.
NWPathMonitor peut afficher satisfied même avec un portail captif. Pour déterminer l’accès Internet réel, effectuez une requête HTTP vers un point de terminaison de confiance via NWConnection. Si une redirection se produit — le portail est actif et nécessite une autorisation dans un WebView.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi