Reachability — egy könyvtár iOS-hez és macOS-hez, amely a SystemConfiguration keretrendszerre épülve lehetővé teszi az internetkapcsolat elérhetőségének ellenőrzését és változásainak nyomon követését. A Apple Developer Documentation (2025) szerint a Reachability az SCNetworkReachability-t használja a hálózat aszinkron figyelésére. A Reachability könyvtár hosszú ideig az iOS projektek szabványa maradt, amíg meg nem jelent a natív NWPathMonitor.
Főbb pontok
A Reachability — egy példa könyvtár az Apple-től, amely bemutatja a SystemConfiguration keretrendszer használatát hálózatfigyelésre. A forráskód az Apple Developer Documentation-ben jelent meg példaként, de a közösség szabványos eszközként fogadta el a kapcsolatellenőrzéshez iOS projektekben.
A könyvtár az SCNetworkReachability — egy C függvény a SystemConfiguration-ból, amely egy távoli hoszt vagy IP cím elérhetőségét értékeli — alapján működik. A Reachability létrehozásakor meg kell adni vagy egy hosztnevet (pl. google.com) vagy egy IP címet, és a könyvtár aszinkron módon ellenőrzi, hogy ez a hoszt elérhető-e az eszköz aktuális hálózati interfészein keresztül.
A Reachability népszerűségét egyszerűségének köszönheti: elég egy példányt létrehozni, feliratkozni az értesítésekre a NotificationCenter-en keresztül, és figyelni a kReachabilityChangedNotification-t. Válaszként az alkalmazás megkapja az állapotot: NotReachable, ReachableViaWiFi vagy ReachableViaWWAN (mobil adatok).
A Reachability először az iPhone OS 2-ben (2008) jelent meg a SystemConfiguration keretrendszerrel együtt. Tíz éven át ez volt az egyetlen natív módszer a hálózat figyelésére iOS-ben. Az iOS 12 és a Network keretrendszer megjelenésével az Apple az NWPathMonitor-t ajánlja helyette, de a Reachability továbbra is támogatott.
Számos harmadik féltől származó burkoló — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — az SCNetworkReachability belső mechanizmusát használja. Ezek a könyvtárak kényelmes Swift/Objective-C interfászt, állapot-memoizációt és szál-biztos visszahívásokat adnak hozzá, megtartva ugyanazt a SystemConfiguration alapot.
A Reachability fő mechanizmusa — az SCNetworkReachabilityCreateWithName függvény, amely egy követő objektumot hoz létre a megadott hoszthoz. Ezután meghívódik az SCNetworkReachabilityGetFlags — egy szinkron ellenőrzés, amely egy SCNetworkReachabilityFlags bitmaszkot ad vissza a hálózat aktuális állapotával.
Aszinkron figyeléshez az SCNetworkReachabilitySetCallback-t használják, amely egy C visszahívási függvényt regisztrál. A visszahívás az aktuális RunLoop-on hajtódik végre, amikor a hoszt elérhetőségi állapota megváltozik. A Reachability ezt a C-visszahívást egy Objective-C metódusba csomagolja, és értesítést küld a NotificationCenter-en keresztül.
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 — egy bitmaszk, amely a hálózat állapotát kódolja. A kSCNetworkReachabilityFlagsReachable jelző azt jelzi, hogy a hoszt elérhető. kSCNetworkReachabilityFlagsConnectionRequired — a kapcsolathoz kommunikáció létrehozása szükséges. A jelzők kombinációja határozza meg, hogy az alkalmazás küldhet-e adatokat.
További jelzők: kSCNetworkReachabilityFlagsIsWWAN — kapcsolat mobilhálózaton keresztül (iOS), kSCNetworkReachabilityFlagsInterventionRequired — felhasználói beavatkozás szükséges (pl. VPN-hez). A Reachability figyelembe veszi ezeket a jelzőket az interfész típusának meghatározásához.
A Reachability szabványos használati mintája egy iOS alkalmazásban magában foglalja egy példány létrehozását, az értesítésekre való feliratkozást és az állapotváltozásra való reagálást. Az alábbi példa a NotificationCenter integrációját mutatja a UI frissítéséhez hálózatváltozáskor.
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("Csatlakoztatva Wi-Fi-n keresztül")
case .cellular:
print("Csatlakoztatva mobilhálózaton keresztül")
case .unavailable:
print("Nincs kapcsolat")
}
}
}
}
Egy HTTP kérés végrehajtása előtt szinkron módon ellenőrizheti a hálózat elérhetőségét: reachability.connection != .unavailable. Ez nem garantálja a kérés sikerét (a szerver lehet, hogy nem érhető el), de megakadályozza az eleve kudarcra ítélt kéréseket és javítja a felhasználói élményt — az alkalmazás nem mutat spinnert offline módban.
Pontosabb ellenőrzéshez kombinálja a Reachability-t URLSession időtúllépésekkel. Ha a Reachability reachable-t mutat, de a kérés nem hajtódik végre az időtúllépésen belül — a probléma valószínűleg a szerver oldalon vagy egy captive portálban van. Ebben az esetben megjeleníthet egy üzenetet a felhasználónak a szerver elérhetetlenségéről.
A Reachability három fő kapcsolati állapotot különböztet meg: Wi-Fi, mobil adatok (WWAN) és elérhetetlenség. A WWAN magában foglalja a mobil kommunikáció összes típusát — 2G, 3G, 4G/LTE, 5G. A könyvtár nem nyújt részletességet a WWAN-on belül, ezért a 4G és 5G megkülönböztetéséhez CoreTelephony szükséges.
| Állapot | SCNetwork jelző | Leírás |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Kapcsolat Wi-Fi hálózaton keresztül, hoszt eléréssel |
| ReachableViaWWAN | Reachable + IsWWAN | Kapcsolat mobilhálózaton keresztül (2G-5G) |
| NotReachable | !Reachable | A hoszt egyetlen interfészen sem érhető el |
| ConnectionRequired | Reachable + ConnectionRequired | Kapcsolat létrehozása szükséges (VPN, PPPoE) |
A Reachability nem különbözteti meg az Ethernetet, VPN alagutakat vagy multipath kapcsolatokat — az összes nem-WWAN interfész Wi-Fi-ként van besorolva. Ez a korlátozás a SystemConfiguration architektúrájából adódik, amely nem nyújt részletes információt a hálózati interfészekről az alapbesoroláson túl.
A mobil kommunikáció konkrét típusának meghatározásához (4G vs 5G) a CoreTelephony CTTelephonyNetworkInfo-jára van szükség. A Reachability és a CoreTelephony kombinálása lehetővé teszi az alkalmazás számára a tartalom minőségének kiválasztását: 5G-nél 4K streaming, 4G/LTE-nél HD, 3G-nél SD vagy csak audio.
Az Apple azt ajánlja, hogy minden új projektben, iOS 12-től kezdve, cserélje ki a Reachability-t NWPathMonitor-ra. A fő ok, hogy az NWPathMonitor a modern Network keretrendszer része, Swift-ben írták, támogatja a Combine-t, és részletes információt nyújt a hálózati útról C kompatibilitás használata nélkül.
A migrációs folyamat magában foglalja az SCNetworkReachability cseréjét NWPathMonitor-ra, áttérést a NotificationCenter-ről pathUpdateHandler closure-re vagy Combine publisher-re. A hálózati állapot feldolgozásának algoritmusa és logikája változatlan marad — csak a figyelő API változik.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Modern implementáció az NWPathMonitor használatával
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()
}
}
Az iOS 12+ alapvető támogatású projektek esetén teljesen cserélje ki a Reachability-t NWPathMonitor-ra. Az iOS 11-et támogató projektek esetén használjon feltétel szerinti fordítást #available(iOS 12, *) NWPathMonitor és Reachability fallbackként. Ez lehetővé teszi a fokozatos áttérést a régebbi eszközök támogatásának elvesztése nélkül.
A migráció fő előnye a hálózati út részletessége. Az NWPathMonitor nem csak „elérhető/nem érhető el” jelent, hanem az egyes interfészek típusát, költségeit, prioritását, proxy és VPN támogatását is. Ez több adatot ad a fejlesztőnek az alkalmazás viselkedésének az aktuális hálózati körülményekhez való igazításához.
Gyakran ismételt kérdések
A Reachability SCNetworkReachability alapokon iPhone OS 2 (iOS 2) óta érhető el. A könyvtár az iOS összes verzióján működik, beleértve a jelenlegieket is. A korlátozások nem az OS verziójához, hanem az információ részletességéhez kapcsolódnak — a régebbi verziókban nincs 4G és 5G megkülönböztetés.
A Reachability az SCNetworkReachability-t használja — egy rendszerszolgáltatást, amely a hoszt elérhetőségét a hálózati verem szintjén értékeli, csomagok küldése nélkül. A ping ICMP csomagokat küld és forgalmat fogyaszt, valamint tűzfal által blokkolható. A Reachability gyorsabb és biztonságosabb a gyakori ellenőrzésekhez.
Igen, a Reachability működik SwiftUI-ben ObservableObject vagy Combine segítségével. Csomagolja egy NotificationCenter-re feliratkozó osztályba, és tegye közzé az állapotot @Published segítségével. Új SwiftUI projektekhez az NWPathMonitor-t ajánljuk Combine publisher-rel a View reaktív frissítéséhez.
A Reachability ellenőrzi a kSCNetworkReachabilityFlagsIsWWAN jelzőt az SCNetworkReachabilityFlags bitmaszkban. Ha a jelző be van állítva — a kapcsolat mobilhálózaton (WWAN) keresztül történik, ha nem és a hoszt Reachable — Wi-Fi-n keresztül. Ez az egyetlen mód a típusok megkülönböztetésére CoreTelephony nélkül.
Az SCNetworkReachability a hoszt elérhetőségét hálózati szinten ellenőrzi, de nem garantálja a magasabb szintű protokollok működését. Lehetséges okok: captive portál, DNS blokkolás, proxy szerver vagy tűzfal. A Reachability egy első szűrő, de nem helyettesíti a tényleges HTTP kérést.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is