Reachability ist eine Bibliothek für iOS und macOS, die auf dem SystemConfiguration-Framework aufbaut und es ermöglicht, die Verfügbarkeit der Internetverbindung zu überprüfen und deren Änderungen zu verfolgen. Laut Apple Developer-Dokumentation (2025) verwendet Reachability SCNetworkReachability für die asynchrone Netzwerküberwachung. Die Reachability-Bibliothek blieb lange Zeit der Standard für iOS-Projekte, bis der native NWPathMonitor erschien.
Wichtige Punkte
Reachability ist eine Beispielbibliothek von Apple, die die Verwendung des SystemConfiguration-Frameworks zur Netzwerküberwachung demonstriert. Der Quellcode wurde in der Apple Developer-Dokumentation als Beispiel veröffentlicht, aber die Community hat ihn als Standardwerkzeug zur Verbindungsprüfung in iOS-Projekten übernommen.
Die Bibliothek basiert auf SCNetworkReachability — einer C-Funktion aus SystemConfiguration, die die Erreichbarkeit eines entfernten Hosts oder einer IP-Adresse bewertet. Beim Erstellen von Reachability wird entweder ein Hostname (z.B. google.com) oder eine IP-Adresse angegeben, und die Bibliothek prüft asynchron, ob dieser Host über die aktuellen Netzwerkschnittstellen des Geräts erreichbar ist.
Die Popularität von Reachability liegt in seiner Einfachheit: Einfach eine Instanz erstellen, Benachrichtigungen über NotificationCenter abonnieren und auf kReachabilityChangedNotification hören. Als Antwort erhält die App einen Status: NotReachable, ReachableViaWiFi oder ReachableViaWWAN (Mobilfunkdaten).
Reachability erschien erstmals in iPhone OS 2 (2008) zusammen mit dem SystemConfiguration-Framework. Ein Jahrzehnt lang war es die einzige native Möglichkeit, den Netzwerkstatus in iOS zu überwachen. Mit der Veröffentlichung von iOS 12 und dem Network-Framework empfiehlt Apple NWPathMonitor als Ersatz, aber Reachability wird weiterhin unterstützt.
Viele Drittanbieter-Wrapper — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — verwenden den internen SCNetworkReachability-Mechanismus. Diese Bibliotheken fügen eine praktische Swift/Objective-C-Schnittstelle, Status-Memoisierung und thread-sichere Callbacks hinzu, während sie dieselbe SystemConfiguration-Basis beibehalten.
Der Hauptmechanismus von Reachability ist die Funktion SCNetworkReachabilityCreateWithName, die ein Tracking-Objekt für den angegebenen Host erstellt. Dann wird SCNetworkReachabilityGetFlags aufgerufen — eine synchrone Prüfung, die eine Bitmaske von SCNetworkReachabilityFlags mit dem aktuellen Netzwerkstatus zurückgibt.
Für die asynchrone Überwachung wird SCNetworkReachabilitySetCallback verwendet, das eine C-Callback-Funktion registriert. Der Callback wird auf dem aktuellen RunLoop ausgeführt, wenn sich der Erreichbarkeitsstatus des Hosts ändert. Reachability kapselt diesen C-Callback in eine Objective-C-Methode und sendet eine Benachrichtigung über 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 ist eine Bitmaske, die den Netzwerkstatus codiert. Das Flag kSCNetworkReachabilityFlagsReachable zeigt an, dass der Host erreichbar ist. kSCNetworkReachabilityFlagsConnectionRequired — eine Verbindung muss hergestellt werden. Die Kombination der Flags bestimmt, ob die Anwendung Daten senden kann.
Zusätzliche Flags: kSCNetworkReachabilityFlagsIsWWAN — Verbindung über Mobilfunknetz (iOS), kSCNetworkReachabilityFlagsInterventionRequired — Benutzereingriff erforderlich (z.B. für VPN). Reachability berücksichtigt diese Flags zur Bestimmung des Schnittstellentyps.
Das Standardmuster zur Verwendung von Reachability in einer iOS-App umfasst das Erstellen einer Instanz, das Abonnieren von Benachrichtigungen und das Reagieren auf Statusänderungen. Das folgende Beispiel zeigt die Integration mit NotificationCenter zur Aktualisierung der Benutzeroberfläche bei Netzwerkänderungen.
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("Mit Wi-Fi verbunden")
case .cellular:
print("Mit Mobilfunk verbunden")
case .unavailable:
print("Keine Verbindung")
}
}
}
}
Vor dem Ausführen einer HTTP-Anfrage kann die Netzwerkverfügbarkeit synchron geprüft werden: reachability.connection != .unavailable. Dies garantiert keinen Erfolg der Anfrage (der Server könnte nicht verfügbar sein), verhindert aber offensichtlich fehlschlagende Anfragen und verbessert die UX — die App zeigt keinen Spinner im Offline-Modus an.
Für eine genauere Prüfung kombinieren Sie Reachability mit URLSession-Zeitüberschreitungen. Wenn Reachability erreichbar anzeigt, die Anfrage aber innerhalb des Timeouts fehlschlägt — liegt wahrscheinlich ein serverseitiges Problem oder ein Captive Portal vor. In diesem Fall kann dem Benutzer eine Meldung angezeigt werden, dass der Server nicht verfügbar ist.
Reachability unterscheidet drei Hauptverbindungszustände: Wi-Fi, Mobilfunkdaten (WWAN) und nicht verfügbar. WWAN umfasst alle Mobilfunkverbindungstypen — 2G, 3G, 4G/LTE, 5G. Die Bibliothek bietet keine Granularität innerhalb von WWAN, daher ist zur Unterscheidung von 4G und 5G CoreTelephony erforderlich.
| Zustand | SCNetwork-Flag | Beschreibung |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Verbindung über Wi-Fi-Netzwerk mit Hostzugriff |
| ReachableViaWWAN | Reachable + IsWWAN | Verbindung über Mobilfunknetz (2G-5G) |
| NotReachable | !Reachable | Host über keine Schnittstelle erreichbar |
| ConnectionRequired | Reachable + ConnectionRequired | Verbindungsaufbau erforderlich (VPN, PPPoE) |
Reachability unterscheidet nicht zwischen Ethernet, VPN-Tunneln oder Multipath-Verbindungen — alle Nicht-WWAN-Schnittstellen werden als Wi-Fi klassifiziert. Diese Einschränkung ergibt sich aus der SystemConfiguration-Architektur, die keine detaillierten Informationen über Netzwerkschnittstellen über die grundlegende Klassifizierung hinaus bereitstellt.
Zur Bestimmung des spezifischen Mobilfunkverbindungstyps (4G vs 5G) ist CTTelephonyNetworkInfo aus CoreTelephony erforderlich. Die Kombination von Reachability mit CoreTelephony ermöglicht es der App, die Inhaltsqualität zu wählen: bei 5G — Streaming in 4K, bei 4G/LTE — HD, bei 3G — SD oder nur Audio.
Apple empfiehlt, Reachability in allen neuen Projekten ab iOS 12 durch NWPathMonitor zu ersetzen. Der Hauptgrund ist, dass NWPathMonitor Teil des modernen Network-Frameworks ist, in Swift geschrieben wurde, Combine unterstützt und detaillierte Netzwerkpfadinformationen ohne C-Kompatibilität bereitstellt.
Der Migrationsprozess umfasst das Ersetzen von SCNetworkReachability durch NWPathMonitor, den Wechsel von NotificationCenter zu einem pathUpdateHandler-Closure oder Combine-Publisher. Der Algorithmus und die Logik zur Behandlung des Netzwerkstatus bleiben gleich — nur die Überwachungs-API ändert sich.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Moderne Implementierung mit 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()
}
}
Für Projekte mit iOS 12+-Unterstützung ersetzen Sie Reachability vollständig durch NWPathMonitor. Für Projekte, die iOS 11 unterstützen, verwenden Sie bedingte Kompilierung #available(iOS 12, *) mit NWPathMonitor und Reachability als Fallback. Dies ermöglicht eine schrittweise Migration ohne Verlust der Unterstützung für ältere Geräte.
Der Hauptvorteil der Migration ist die Granularität des Netzwerkpfads. NWPathMonitor meldet nicht nur „er Reichbar/nicht erreichbar“ sondern auch den Typ jeder Schnittstelle, deren Kosten, Priorität, Proxy- und VPN-Unterstützung. Dies gibt dem Entwickler mehr Daten, um das Anwendungsverhalten an aktuelle Netzwerkbedingungen anzupassen.
Häufig gestellte Fragen
Reachability basierend auf SCNetworkReachability ist ab iPhone OS 2 (iOS 2) verfügbar. Die Bibliothek funktioniert auf allen iOS-Versionen, einschließlich der aktuellen. Die Einschränkungen betreffen nicht die OS-Version, sondern die Detailgenauigkeit der Informationen — ältere Versionen unterscheiden nicht zwischen 4G und 5G.
Reachability verwendet SCNetworkReachability — einen Systemdienst, der die Erreichbarkeit des Hosts auf Netzwerkstack-Ebene bewertet, ohne Pakete zu senden. Ping sendet ICMP-Pakete und verbraucht Datenverkehr, und kann auch von einer Firewall blockiert werden. Reachability ist schneller und sicherer für häufige Prüfungen.
Ja, Reachability funktioniert in SwiftUI über ObservableObject oder Combine. Wickeln Sie es in eine Klasse ein, die NotificationCenter abonniert hat, und veröffentlichen Sie den Status über @Published. Für neue SwiftUI-Projekte empfehlen wir NWPathMonitor mit einem Combine-Publisher für reaktive View-Updates.
Reachability prüft das Flag kSCNetworkReachabilityFlagsIsWWAN in der SCNetworkReachabilityFlags-Bitmaske. Wenn das Flag gesetzt ist — Verbindung über Mobilfunknetz (WWAN), wenn nicht und der Host Reachable ist — über Wi-Fi. Dies ist die einzige Möglichkeit, Typen ohne CoreTelephony zu unterscheiden.
SCNetworkReachability prüft die Erreichbarkeit des Hosts auf Netzwerkebene, garantiert aber nicht die Funktion höherer Protokolle. Mögliche Ursachen: Captive Portal, DNS-Sperrung, Proxy-Server oder Firewall. Reachability ist der erste Filter, aber kein Ersatz für eine echte HTTP-Anfrage.
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