Reachability — een bibliotheek voor iOS en macOS, gebouwd op het SystemConfiguration-framework, waarmee u de beschikbaarheid van de internetverbinding kunt controleren en de wijzigingen ervan kunt volgen. Volgens Apple Developer Documentation (2025) gebruikt Reachability SCNetworkReachability voor asynchrone netwerkmonitoring. De Reachability-bibliotheek bleef lange tijd de standaard voor iOS-projecten tot de komst van native NWPathMonitor.
Belangrijkste
Reachability — is een voorbeeldbibliotheek van Apple die het gebruik van het SystemConfiguration-framework voor netwerkmonitoring demonstreert. De broncode is gepubliceerd in Apple Developer Documentation als voorbeeld, maar de community heeft het aangenomen als standaardtool voor verbindingscontrole in iOS-projecten.
De bibliotheek werkt op basis van SCNetworkReachability — een C-functie uit SystemConfiguration die de bereikbaarheid van een externe host of IP-adres beoordeelt. Bij het maken van Reachability wordt ofwel een hostnaam (bijv. google.com) ofwel een IP-adres opgegeven, en de bibliotheek controleert asynchroon of deze host bereikbaar is via de huidige netwerkinterfaces van het apparaat.
De populariteit van Reachability is te danken aan de eenvoud: maak een instantie, abonneer u op meldingen via NotificationCenter en luister naar kReachabilityChangedNotification. Als antwoord ontvangt de app de status: NotReachable, ReachableViaWiFi of ReachableViaWWAN (mobiele data).
Reachability verscheen voor het eerst in iPhone OS 2 (2008) samen met het SystemConfiguration-framework. Tien jaar lang was het de enige native manier om netwerken te monitoren in iOS. Met de release van iOS 12 en het Network-framework beveelt Apple NWPathMonitor aan als vervanging, maar Reachability wordt nog steeds ondersteund.
Veel wrappers van derden — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — gebruiken het interne SCNetworkReachability-mechanisme. Deze bibliotheken voegen een handige Swift/Objective-C-interface, statusmemoïsie en thread-safe callbacks toe, met behoud van dezelfde SystemConfiguration-basis.
Het belangrijkste mechanisme van Reachability — de functie SCNetworkReachabilityCreateWithName, die een trackingobject maakt voor de opgegeven host. Vervolgens wordt SCNetworkReachabilityGetFlags aangeroepen — een synchrone controle die een bitmasker SCNetworkReachabilityFlags met de huidige netwerkstatus retourneert.
Voor asynchrone monitoring wordt SCNetworkReachabilitySetCallback gebruikt, die een C-callbackfunctie registreert. De callback wordt uitgevoerd op de huidige RunLoop wanneer de bereikbaarheidsstatus van de host verandert. Reachability wikkelt deze C-callback in een Objective-C-methode en stuurt een melding 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 — een bitmasker dat de netwerkstatus codeert. De vlag kSCNetworkReachabilityFlagsReachable geeft aan dat de host bereikbaar is. kSCNetworkReachabilityFlagsConnectionRequired — voor verbinding is het tot stand brengen van communicatie vereist. De combinatie van vlaggen bepaalt of de app gegevens kan verzenden.
Extra vlaggen: kSCNetworkReachabilityFlagsIsWWAN — verbinding via mobiel netwerk (iOS), kSCNetworkReachabilityFlagsInterventionRequired — gebruikersinterventie vereist (bijv. voor VPN). Reachability houdt rekening met deze vlaggen om het interfacetype te bepalen.
Het standaard gebruikspatroon van Reachability in een iOS-app omvat het maken van een instantie, het abonneren op meldingen en reageren op statuswijzigingen. Het onderstaande voorbeeld toont integratie met NotificationCenter voor het bijwerken van de UI bij netwerkwijzigingen.
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("Verbonden via Wi-Fi")
case .cellular:
print("Verbonden via mobiel netwerk")
case .unavailable:
print("Geen verbinding")
}
}
}
}
Voordat u een HTTP-verzoek uitvoert, kunt u de netwerkbeschikbaarheid synchroon controleren: reachability.connection != .unavailable. Dit garandeert geen succes van het verzoek (de server kan onbereikbaar zijn), maar voorkomt gedoemde verzoeken en verbetert de UX — de app toont geen spinner in de offline-modus.
Voor een nauwkeurigere controle combineert u Reachability met URLSession-time-outs. Als Reachability reachable aangeeft maar het verzoek niet binnen de time-out wordt uitgevoerd — ligt het probleem waarschijnlijk aan de serverzijde of een captive portal. In dat geval kunt u de gebruiker een bericht over serveronbereikbaarheid tonen.
Reachability onderscheidt drie hoofdverbindingstoestanden: Wi-Fi, mobiele data (WWAN) en onbereikbaarheid. WWAN omvat alle typen mobiele communicatie — 2G, 3G, 4G/LTE, 5G. De bibliotheek biedt geen details binnen WWAN, dus voor het onderscheiden van 4G en 5G is CoreTelephony vereist.
| Toestand | SCNetwork-vlag | Beschrijving |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Verbinding via Wi-Fi-netwerk met toegang tot host |
| ReachableViaWWAN | Reachable + IsWWAN | Verbinding via mobiel netwerk (2G-5G) |
| NotReachable | !Reachable | Host niet bereikbaar via enige interface |
| ConnectionRequired | Reachable + ConnectionRequired | Verbinding tot stand brengen vereist (VPN, PPPoE) |
Reachability maakt geen onderscheid tussen Ethernet, VPN-tunnels of multipath-verbindingen — alle niet-WWAN-interfaces worden geclassificeerd als Wi-Fi. Deze beperking hangt samen met de architectuur van SystemConfiguration, die geen gedetailleerde informatie over netwerkinterfaces biedt buiten de basisclassificatie.
Voor het bepalen van het specifieke type mobiele communicatie (4G vs 5G) is CTTelephonyNetworkInfo uit CoreTelephony vereist. Het combineren van Reachability met CoreTelephony stelt de app in staat de inhoudskwaliteit te kiezen: bij 5G — 4K-streaming, bij 4G/LTE — HD, bij 3G — SD of alleen audio.
Apple beveelt aan om Reachability in alle nieuwe projecten te vervangen door NWPathMonitor, vanaf iOS 12. De belangrijkste reden is dat NWPathMonitor deel uitmaakt van het moderne Network-framework, geschreven in Swift, Combine ondersteunt en gedetailleerde informatie over het netwerkpad biedt zonder C-compatibiliteit.
Het migratieproces omvat het vervangen van SCNetworkReachability door NWPathMonitor, de overstap van NotificationCenter naar pathUpdateHandler-closure of Combine-publisher. Het algoritme en de logica voor netwerkstatusverwerking blijven hetzelfde — alleen de monitoring-API verandert.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Moderne implementatie met 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()
}
}
Vervang voor projecten met basisondersteuning voor iOS 12+ Reachability volledig door NWPathMonitor. Gebruik voor projecten die iOS 11 ondersteunen conditionele compilatie #available(iOS 12, *) met NWPathMonitor en Reachability als fallback. Dit maakt geleidelijke migratie mogelijk zonder verlies van ondersteuning voor oudere apparaten.
Het belangrijkste voordeel van migratie is de detaillering van het netwerkpad. NWPathMonitor rapporteert niet alleen ‘bereikbaar/onbereikbaar’, maar ook het type van elke interface, de kosten, prioriteit, ondersteuning voor proxy en VPN. Dit geeft de ontwikkelaar meer gegevens om het gedrag van de app aan te passen aan de huidige netwerkomstandigheden.
Veelgestelde vragen
Reachability op SCNetworkReachability is beschikbaar vanaf iPhone OS 2 (iOS 2). De bibliotheek werkt op alle iOS-versies, inclusief de huidige. Beperkingen hebben niet te maken met de OS-versie, maar met de detaillering van informatie — op oudere versies is er geen onderscheid tussen 4G en 5G.
Reachability gebruikt SCNetworkReachability — een systeemservice die de bereikbaarheid van de host op netwerkstackniveau beoordeelt zonder pakketten te verzenden. Ping verzendt ICMP-pakketten en verbruikt verkeer, en kan ook door een firewall worden geblokkeerd. Reachability is sneller en veiliger voor frequente controles.
Ja, Reachability werkt in SwiftUI via ObservableObject of Combine. Wikkel het in een klasse die is geabonneerd op NotificationCenter en publiceer de status via @Published. Voor nieuwe SwiftUI-projecten raden we NWPathMonitor met Combine publisher aan voor reactieve view-updates.
Reachability controleert de vlag kSCNetworkReachabilityFlagsIsWWAN in het bitmasker SCNetworkReachabilityFlags. Als de vlag is ingesteld — verbinding via mobiel netwerk (WWAN), zo niet en de host is Reachable — via Wi-Fi. Dit is de enige manier om typen te onderscheiden zonder CoreTelephony.
SCNetworkReachability controleert de bereikbaarheid van de host op netwerkniveau, maar garandeert niet de werking van hogerliggende protocollen. Mogelijke oorzaken: captive portal, DNS-blokkade, proxyserver of firewall. Reachability is een eerste filter, maar geen vervanging voor een echt HTTP-verzoek.
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