Reachability est une bibliothèque pour iOS et macOS construite sur le framework SystemConfiguration qui permet de vérifier la disponibilité de la connexion Internet et de suivre ses changements. Selon la Documentation Apple Developer (2025), Reachability utilise SCNetworkReachability pour la surveillance asynchrone du réseau. La bibliothèque Reachability est restée la norme pour les projets iOS jusqu’à l’apparition du NWPathMonitor natif.
Points clés
Reachability est une bibliothèque d’exemple d’Apple démontrant l’utilisation du framework SystemConfiguration pour la surveillance réseau. Le code source a été publié dans la Documentation Apple Developer comme exemple, mais la communauté l’a adopté comme outil standard de vérification de connectivité dans les projets iOS.
La bibliothèque est basée sur SCNetworkReachability — une fonction C de SystemConfiguration qui évalue l’accessibilité d’un hôte distant ou d’une adresse IP. Lors de la création de Reachability, on spécifie un nom d’hôte (par exemple google.com) ou une adresse IP, et la bibliothèque vérifie de façon asynchrone si cet hôte est accessible via les interfaces réseau actuelles de l’appareil.
La popularité de Reachability tient à sa simplicité : il suffit de créer une instance, de s’abonner aux notifications via NotificationCenter et d’écouter kReachabilityChangedNotification. En réponse, l’application reçoit un statut : NotReachable, ReachableViaWiFi ou ReachableViaWWAN (données cellulaires).
Reachability est apparue pour la première fois dans iPhone OS 2 (2008) avec le framework SystemConfiguration. Pendant une décennie, elle a été le seul moyen natif de surveiller l’état du réseau sous iOS. Avec la sortie d’iOS 12 et du framework Network, Apple recommande NWPathMonitor comme remplacement, mais Reachability est toujours prise en charge.
De nombreux wrappers tiers — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — utilisent le mécanisme interne de SCNetworkReachability. Ces bibliothèques ajoutent une interface pratique en Swift/Objective-C, la mémoisation du statut et des callbacks thread-safe, tout en conservant la même base SystemConfiguration.
Le mécanisme principal de Reachability est la fonction SCNetworkReachabilityCreateWithName, qui crée un objet de suivi pour l’hôte spécifié. Ensuite, SCNetworkReachabilityGetFlags est appelée — une vérification synchrone qui renvoie un masque de bits SCNetworkReachabilityFlags avec l’état actuel du réseau.
Pour la surveillance asynchrone, SCNetworkReachabilitySetCallback est utilisé, enregistrant une fonction de rappel C. Le rappel s’exécute sur le RunLoop actuel lorsque l’état d’accessibilité de l’hôte change. Reachability encapsule ce rappel C dans une méthode Objective-C et envoie une notification via NotificationCenter.
import SystemConfiguration
class Reachability {
private var reachabilityRef: SCNetworkReachability?
init?(hostname: String) {
reachabilityRef = SCNetworkReachabilityCreateWithName(
nil, hostname
)
}
func checkReachability() -> Bool {
var flags = SCNetworkReachabilityFlags()
SCNetworkReachabilityGetFlags(
reachabilityRef!, &flags
)
return isReachable(with: flags)
}
private func isReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
let reachable = flags.contains(.reachable)
let connectionRequired = flags.contains(.connectionRequired)
return reachable && !connectionRequired
}
}
SCNetworkReachabilityFlags est un masque de bits qui code l’état du réseau. L’indicateur kSCNetworkReachabilityFlagsReachable signale que l’hôte est accessible. kSCNetworkReachabilityFlagsConnectionRequired — une connexion doit être établie. La combinaison des indicateurs détermine si l’application peut envoyer des données.
Indicateurs supplémentaires : kSCNetworkReachabilityFlagsIsWWAN — connexion via le réseau cellulaire (iOS), kSCNetworkReachabilityFlagsInterventionRequired — intervention de l’utilisateur nécessaire (par exemple pour VPN). Reachability prend en compte ces indicateurs pour déterminer le type d’interface.
Le modèle standard d’utilisation de Reachability dans une application iOS comprend la création d’une instance, l’abonnement aux notifications et la réaction aux changements de statut. L’exemple ci-dessous montre l’intégration avec NotificationCenter pour mettre à jour l’interface utilisateur lors d’un changement de réseau.
import Reachability
import UIKit
class ViewController: UIViewController {
var reachability: Reachability?
override func viewDidLoad() {
super.viewDidLoad()
reachability = Reachability(hostname: "google.com")
NotificationCenter.default.addObserver(
self,
selector: #selector(reachabilityChanged),
name: .reachabilityChanged,
object: nil
)
reachability?.startNotifier()
}
@objc func reachabilityChanged(notification: Notification) {
if let reachability = notification.object as? Reachability {
switch reachability.connection {
case .wifi:
print("Connecté via Wi-Fi")
case .cellular:
print("Connecté via cellulaire")
case .unavailable:
print("Aucune connexion")
}
}
}
}
Avant d’exécuter une requête HTTP, on peut vérifier la disponibilité du réseau de façon synchrone : reachability.connection != .unavailable. Cela ne garantit pas le succès de la requête (le serveur peut être indisponible), mais évite les requêtes vouées à l’échec et améliore l’UX — l’application n’affiche pas de spinner en mode hors ligne.
Pour une vérification plus précise, combinez Reachability avec les délais d’attente d’URLSession. Si Reachability indique accessible mais que la requête échoue dans le délai imparti — il y a probablement un problème côté serveur ou un portail captif. Dans ce cas, on peut afficher à l’utilisateur un message d’indisponibilité du serveur.
Reachability distingue trois états de connexion principaux : Wi-Fi, données cellulaires (WWAN) et indisponible. WWAN inclut tous les types de connexion cellulaire — 2G, 3G, 4G/LTE, 5G. La bibliothèque ne fournit pas de granularité au sein de WWAN, donc pour distinguer la 4G de la 5G, CoreTelephony est nécessaire.
| État | Indicateur SCNetwork | Description |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Connexion via réseau Wi-Fi avec accès à l’hôte |
| ReachableViaWWAN | Reachable + IsWWAN | Connexion via réseau cellulaire (2G-5G) |
| NotReachable | !Reachable | Hôte inaccessible via toute interface |
| ConnectionRequired | Reachable + ConnectionRequired | Établissement de connexion nécessaire (VPN, PPPoE) |
Reachability ne distingue pas Ethernet, les tunnels VPN ou les connexions multipath — toutes les interfaces non-WWAN sont classées comme Wi-Fi. Cette limitation découle de l’architecture SystemConfiguration, qui ne fournit pas d’informations détaillées sur les interfaces réseau au-delà de la classification de base.
Pour déterminer le type spécifique de connexion cellulaire (4G vs 5G), CTTelephonyNetworkInfo de CoreTelephony est requis. La combinaison de Reachability avec CoreTelephony permet à l’application de sélectionner la qualité du contenu : en 5G — streaming en 4K, en 4G/LTE — HD, en 3G — SD ou audio uniquement.
Apple recommande de remplacer Reachability par NWPathMonitor dans tous les nouveaux projets à partir d’iOS 12. La raison principale est que NWPathMonitor fait partie du framework Network moderne, est écrit en Swift, prend en charge Combine et fournit des informations détaillées sur le chemin réseau sans utiliser de compatibilité C.
Le processus de migration comprend le remplacement de SCNetworkReachability par NWPathMonitor, le passage de NotificationCenter à une closure pathUpdateHandler ou un publisher Combine. L’algorithme et la logique de gestion du statut réseau restent les mêmes — seule l’API de surveillance change.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Implémentation moderne utilisant NWPathMonitor
class ModernNetworkMonitor: NetworkMonitorProtocol {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("Network")
private var currentPath: NWPath?
var isReachable: Bool {
currentPath?.status == .satisfied
}
func startMonitoring() {
monitor.pathUpdateHandler = { [weak self] path in
self?.currentPath = path
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
Pour les projets ciblant iOS 12+, remplacez entièrement Reachability par NWPathMonitor. Pour les projets prenant en charge iOS 11, utilisez la compilation conditionnelle #available(iOS 12, *) avec NWPathMonitor et Reachability comme solution de repli. Cela permet une migration progressive sans perdre la prise en charge des anciens appareils.
Le principal avantage de la migration est la granularité du chemin réseau. NWPathMonitor signale non seulement « accessible/inaccessible » mais aussi le type de chaque interface, leurs coûts, priorité, support proxy et VPN. Cela donne au développeur plus de données pour adapter le comportement de l’application aux conditions réseau actuelles.
Foire aux questions
Reachability basé sur SCNetworkReachability est disponible à partir d’iPhone OS 2 (iOS 2). La bibliothèque fonctionne sur toutes les versions d’iOS, y compris les versions actuelles. Les limitations ne concernent pas la version de l’OS mais la granularité des informations — les anciennes versions ne distinguent pas la 4G de la 5G.
Reachability utilise SCNetworkReachability — un service système qui évalue l’accessibilité de l’hôte au niveau de la pile réseau sans envoyer de paquets. Ping envoie des paquets ICMP et consomme du trafic, et peut également être bloqué par un pare-feu. Reachability est plus rapide et plus sûr pour des vérifications fréquentes.
Oui, Reachability fonctionne dans SwiftUI via ObservableObject ou Combine. Encapsulez-le dans une classe abonnée à NotificationCenter et publiez le statut via @Published. Pour les nouveaux projets SwiftUI, nous recommandons NWPathMonitor avec un publisher Combine pour des mises à jour réactives de la vue.
Reachability vérifie l’indicateur kSCNetworkReachabilityFlagsIsWWAN dans le masque de bits SCNetworkReachabilityFlags. Si l’indicateur est défini — connexion via le réseau cellulaire (WWAN), sinon et l’hôte est Reachable — via Wi-Fi. C’est le seul moyen de distinguer les types sans CoreTelephony.
SCNetworkReachability vérifie l’accessibilité de l’hôte au niveau réseau mais ne garantit pas le fonctionnement des protocoles supérieurs. Causes possibles : portail captif, blocage DNS, serveur proxy ou pare-feu. Reachability est le premier filtre mais ne remplace pas une véritable requête HTTP.
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