Reachability: mi ez, a hálózati elérhetőség ellenőrzésére szolgáló könyvtár

Szerző: IT Sectr Megjelenés: 2026-03-11 Olvasási idő: 10 perc

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

  • Reachability — egy burkoló a SystemConfiguration C-keretrendszer körül a hálózati elérhetőség figyelésére iOS-ben és macOS-ben.
  • SCNetworkReachability — alacsony szintű C-API, amely egy távoli hoszt vagy cím elérhetőségét ellenőrzi.
  • Kapcsolattípusok — a Reachability megkülönbözteti a Wi-Fi-t és a mobil adatokat (WWAN) az alkalmazás viselkedésének igazításához.
  • Értesítések — az SCNetworkReachabilitySetCallback segítségével a könyvtár feliratkozik a hálózati változásokra a RunLoop segítségével.
  • NWPathMonitor — a Reachability modern alternatívája, iOS 12-től elérhető és az Apple által ajánlott.

Mi az a Reachability?

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 könyvtár története és állapota

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.

Hogyan működik a Reachability a motorháztető alatt

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.

swift
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
    }
}

Hálózati elérhetőségi jelzők

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.

Példák a Reachability használatára

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.

swift
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")
            }
        }
    }
}

Hálózat ellenőrzése kérés előtt

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.

Kapcsolattípusok a Reachability-ben

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.

ÁllapotSCNetwork jelzőLeírás
ReachableViaWiFiReachable + !IsWWANKapcsolat Wi-Fi hálózaton keresztül, hoszt eléréssel
ReachableViaWWANReachable + IsWWANKapcsolat mobilhálózaton keresztül (2G-5G)
NotReachable!ReachableA hoszt egyetlen interfészen sem érhető el
ConnectionRequiredReachable + ConnectionRequiredKapcsolat létrehozása szükséges (VPN, PPPoE)

A Reachability korlátozásai hálózattípusonként

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.

Migrálás Reachability-ről NWPathMonitor-ra

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.

swift
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()
    }
}

Migrációs ajánlások

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

Mi a Reachability által támogatott minimális iOS verzió?

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.

Miben különbözik a Reachability egy egyszerű ping ellenőrzéstől?

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.

Használható a Reachability SwiftUI projektekben?

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.

Hogyan határozza meg a Reachability a Wi-Fi vs mobil adatokat?

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.

Miért mutat a Reachability elérhetőséget, de a kérések nem működnek?

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ó

  • Reachability — SystemConfiguration alapú könyvtár iOS hálózatfigyeléshez, amely az SCNetworkReachability C-API-n keresztül működik.
  • Három állapot — Wi-Fi, mobil adatok (WWAN) és elérhetetlenség — az SCNetworkReachabilityFlags bitjelzői által meghatározva.
  • Aszinkron értesítések az SCNetworkReachabilitySetCallback segítségével, RunLoop és NotificationCenter használatával.
  • Korlátozások — a Reachability nem különbözteti meg a 4G/5G, VPN, Ethernet és nem ad információt a forgalmi költségekről.
  • NWPathMonitor — a Reachability modern helyettesítője iOS 12+ rendszerhez, részletes NWPath-tel, típussal, költségekkel és multipath-val.
  • Migráció magában foglalja az SCNetworkReachability cseréjét NWPathMonitor-ra a logika megtartásával a NetworkMonitorProtocol protokollon keresztül.
  • A Reachability továbbra is szükséges az iOS 11 és az alatti támogatású projektekhez vagy gyors szinkron ellenőrzésekhez.

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.

Projekt megbeszélése

Olvassa el is