Reachability: co to je, knihovna pro kontrolu dostupnosti sítě

Autor: IT Sectr Publikováno: 2026-03-11 Doba čtení: 10 min

Reachability — knihovna pro iOS a macOS, postavená na frameworku SystemConfiguration, která umožňuje kontrolovat dostupnost připojení k internetu a sledovat jeho změny. Podle Apple Developer Documentation (2025) používá Reachability SCNetworkReachability pro asynchronní monitorování sítě. Knihovna Reachability zůstala dlouhou dobu standardem pro iOS projekty až do příchodu nativního NWPathMonitor.

Hlavní body

  • Reachability — obal nad C-frameworkem SystemConfiguration pro monitorování dostupnosti sítě v iOS a macOS.
  • SCNetworkReachability — nízkoúrovňové C-API, které kontroluje dosažitelnost vzdáleného hostitele nebo adresy.
  • Typy připojení — Reachability rozlišuje Wi-Fi a mobilní data (WWAN) pro přizpůsobení chování aplikace.
  • Oznámení — prostřednictvím SCNetworkReachabilitySetCallback se knihovna přihlašuje ke změnám sítě pomocí RunLoop.
  • NWPathMonitor — moderní alternativa k Reachability, dostupná od iOS 12 a doporučená společností Apple.

Co je Reachability?

Reachability — je ukázková knihovna od Apple, která demonstruje použití frameworku SystemConfiguration pro monitorování sítě. Zdrojový kód byl publikován v Apple Developer Documentation jako příklad, ale komunita jej přijala jako standardní nástroj pro kontrolu připojení v iOS projektech.

Knihovna pracuje na základě SCNetworkReachability — funkce C ze SystemConfiguration, která vyhodnocuje dosažitelnost vzdáleného hostitele nebo IP adresy. Při vytváření Reachability se zadává buď název hostitele (např. google.com) nebo IP adresa a knihovna asynchronně kontroluje, zda je tento hostitel dosažitelný prostřednictvím aktuálních síťových rozhraní zařízení.

Oblíbenost Reachability je dána její jednoduchostí: stačí vytvořit instanci, přihlásit se k odběru oznámení prostřednictvím NotificationCenter a poslouchat kReachabilityChangedNotification. Jako odpověď aplikace obdrží stav: NotReachable, ReachableViaWiFi nebo ReachableViaWWAN (mobilní data).

Historie a stav knihovny

Reachability se poprvé objevila v iPhone OS 2 (2008) spolu s frameworkem SystemConfiguration. Po deset let byla jediným nativním způsobem monitorování sítě v iOS. S vydáním iOS 12 a frameworku Network Apple doporučuje NWPathMonitor jako náhradu, ale Reachability je stále podporována.

Mnoho obalů třetích stran — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — používá vnitřní mechanismus SCNetworkReachability. Tyto knihovny přidávají pohodlné rozhraní Swift/Objective-C, memoizaci stavu a thread-safe zpětná volání, přičemž zachovávají stejný základ SystemConfiguration.

Jak Reachability funguje pod kapotou

Hlavním mechanismem Reachability je funkce SCNetworkReachabilityCreateWithName, která vytváří objekt sledování pro zadaného hostitele. Poté je volána SCNetworkReachabilityGetFlags — synchronní kontrola, která vrací bitovou masku SCNetworkReachabilityFlags s aktuálním stavem sítě.

Pro asynchronní monitorování se používá SCNetworkReachabilitySetCallback, která registruje funkci zpětného volání C. Zpětné volání se provádí na aktuálním RunLoop, když se změní stav dosažitelnosti hostitele. Reachability zabalí toto C zpětné volání do metody Objective-C a odešle oznámení prostřednictvím NotificationCenter.

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

Příznaky dosažitelnosti sítě

SCNetworkReachabilityFlags — bitová maska, která kóduje stav sítě. Příznak kSCNetworkReachabilityFlagsReachable označuje, že hostitel je dosažitelný. kSCNetworkReachabilityFlagsConnectionRequired — pro připojení je vyžadováno navázání komunikace. Kombinace příznaků určuje, zda aplikace může odesílat data.

Další příznaky: kSCNetworkReachabilityFlagsIsWWAN — připojení prostřednictvím mobilní sítě (iOS), kSCNetworkReachabilityFlagsInterventionRequired — vyžaduje zásah uživatele (např. pro VPN). Reachability bere tyto příznaky v úvahu pro určení typu rozhraní.

Příklady použití Reachability

Standardní vzor použití Reachability v aplikaci pro iOS zahrnuje vytvoření instance, přihlášení k odběru oznámení a reakci na změnu stavu. Níže uvedený příklad ukazuje integraci s NotificationCenter pro aktualizaci UI při změně sítě.

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("Připojeno přes Wi-Fi")
            case .cellular:
                print("Připojeno přes mobilní síť")
            case .unavailable:
                print("Žádné připojení")
            }
        }
    }
}

Kontrola sítě před požadavkem

Před provedením HTTP požadavku lze zkontrolovat dostupnost sítě synchronně: reachability.connection != .unavailable. To nezaručuje úspěšnost požadavku (server může být nedostupný), ale zabraňuje předem odsouzeným požadavkům a zlepšuje UX — aplikace nezobrazuje spinner v offline režimu.

Pro přesnější kontrolu kombinujte Reachability s časovými limity URLSession. Pokud Reachability zobrazuje reachable, ale požadavek se neprovede v časovém limitu — problém je pravděpodobně na straně serveru nebo captive portál. V takovém případě lze uživateli zobrazit zprávu o nedostupnosti serveru.

Typy připojení v Reachability

Reachability rozlišuje tŕ0 základní stavy připojení: Wi-Fi, mobilní data (WWAN) a nedostupnost. WWAN zahrnuje všechny typy mobilní komunikace — 2G, 3G, 4G/LTE, 5G. Knihovna neposkytuje podrobnosti v rámci WWAN, proto pro rozlišení 4G a 5G je vyžadován CoreTelephony.

StavPříznak SCNetworkPopis
ReachableViaWiFiReachable + !IsWWANPřipojení prostřednictvím sítě Wi-Fi s přístupem k hostiteli
ReachableViaWWANReachable + IsWWANPřipojení prostřednictvím mobilní sítě (2G-5G)
NotReachable!ReachableHostitel je nedosažitelný prostřednictvím žádného rozhraní
ConnectionRequiredReachable + ConnectionRequiredVyžaduje navázání připojení (VPN, PPPoE)

Omezení Reachability podle typů sítí

Reachability nerozlišuje Ethernet, VPN tunely nebo multipath připojení — všechna rozhraní jiná než WWAN jsou klasifikována jako Wi-Fi. Toto omezení souvisí s architekturou SystemConfiguration, která neposkytuje podrobné informace o síťových rozhraních mimo základní klasifikaci.

Pro určení konkrétního typu mobilní komunikace (4G vs 5G) je vyžadován CTTelephonyNetworkInfo z CoreTelephony. Kombinace Reachability s CoreTelephony umožňuje aplikaci vybrat kvalitu obsahu: při 5G — streaming ve 4K, při 4G/LTE — HD, při 3G — SD nebo pouze zvuk.

Migrace z Reachability na NWPathMonitor

Apple doporučuje nahradit Reachability pomocí NWPathMonitor ve všech nových projektech, počínaje iOS 12. Hlavním důvodem je, že NWPathMonitor je součástí moderního frameworku Network, napsaného v Swift, podporuje Combine a poskytuje podrobné informace o síťové cestě bez použití kompatibility s C.

Proces migrace zahrnuje nahrazení SCNetworkReachability pomocí NWPathMonitor, přechod z NotificationCenter na pathUpdateHandler closure nebo Combine publisher. Algoritmus a logika zpracování stavu sítě zůstávají stejné — mění se pouze API pro monitorování.

swift
protocol NetworkMonitorProtocol {
    var isReachable: Bool { get }
    var connectionType: ConnectionType { get }
    func startMonitoring()
    func stopMonitoring()
}

enum ConnectionType {
    case wifi, cellular, ethernet, unavailable
}

// Moderní implementace pomocí 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()
    }
}

Doporučení pro migraci

U projektů se základní podporou iOS 12+ nahraďte Reachability zcela pomocí NWPathMonitor. U projektů podporujících iOS 11 použijte podmíněnou kompilaci #available(iOS 12, *) s NWPathMonitor a Reachability jako fallback. To umožňuje postupnou migraci bez ztráty podpory starších zařízení.

Hlavní výhodou migrace je podrobnost síťové cesty. NWPathMonitor nejen hlásí „dostupný/nedostupný”, ale také typ každého rozhraní, jeho náklady, prioritu, podporu proxy a VPN. To dává vývojáři více dat pro přizpůsobení chování aplikace aktuálním síťovým podmínkám.

Často kladené dotazy

Jaká je minimální verze iOS podporující Reachability?

Reachability na SCNetworkReachability je dostupná od iPhone OS 2 (iOS 2). Knihovna funguje na všech verzích iOS, včetně těch aktuálních. Omezení se netýkají verze OS, ale podrobností informací — na starších verzích neexistuje rozlišení 4G a 5G.

Čím se Reachability liší od jednoduché kontroly ping?

Reachability používá SCNetworkReachability — systémovou službu, která vyhodnocuje dosažitelnost hostitele na úrovni síťového zásobníku bez odesílání paketů. Ping odesílá ICMP pakety a spotřebovává provoz, a může být také blokován firewallem. Reachability je rychlejší a bezpečnější pro časté kontroly.

Lze použít Reachability v projektech SwiftUI?

Ano, Reachability funguje ve SwiftUI prostřednictvím ObservableObject nebo Combine. Zabalte ji do třídy přihlášené k NotificationCenter a zveřejněte stav pomocí @Published. Pro nové projekty SwiftUI doporučujeme NWPathMonitor s Combine publisher pro reaktivní aktualizaci View.

Jak Reachability určuje Wi-Fi vs mobilní data?

Reachability kontroluje příznak kSCNetworkReachabilityFlagsIsWWAN v bitové masce SCNetworkReachabilityFlags. Pokud je příznak nastaven — připojení je prostřednictvím mobilní sítě (WWAN), pokud ne a hostitel je Reachable — prostřednictvím Wi-Fi. Je to jediný způsob, jak rozlišit typy bez CoreTelephony.

Proč Reachability zobrazuje dostupnost, ale požadavky nefungují?

SCNetworkReachability kontroluje dosažitelnost hostitele na síťové úrovni, ale nezaručuje fungování protokolů vyšší úrovně. Možné příčiny: captive portál, blokování DNS, proxy server nebo firewall. Reachability je prvním filtrem, ale nenahrazuje skutečný HTTP požadavek.

Shrnutí

  • Reachability — knihovna na SystemConfiguration pro monitorování iOS sítě, pracující prostřednictvím SCNetworkReachability C-API.
  • Tŕ0 stavy — Wi-Fi, mobilní data (WWAN) a nedostupnost — určené bitovými příznaky SCNetworkReachabilityFlags.
  • Asynchronní oznámení realizovaná prostřednictvím SCNetworkReachabilitySetCallback s RunLoop a NotificationCenter.
  • Omezení — Reachability nerozlišuje 4G/5G, VPN, Ethernet a neposkytuje informace o nákladech na provoz.
  • NWPathMonitor — moderní náhrada Reachability pro iOS 12+, poskytující podrobný NWPath s typem, náklady a multipath.
  • Migrace zahrnuje nahrazení SCNetworkReachability pomocí NWPathMonitor s zachováním logiky prostřednictvím protokolu NetworkMonitorProtocol.
  • Reachability zůstává potřebná pro projekty s podporou iOS 11 a nižších verzí nebo pro rychlou synchronní kontrolu.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také