Reachability — o bibliotecă pentru iOS și macOS, construită pe framework-ul SystemConfiguration, care permite verificarea disponibilității conexiunii la internet și monitorizarea schimbărilor acesteia. Conform Apple Developer Documentation (2025), Reachability folosește SCNetworkReachability pentru monitorizarea asincronă a rețelei. Biblioteca Reachability a rămas mult timp standardul pentru proiectele iOS până la apariția NWPathMonitor nativ.
Principalele
Reachability — este o bibliotecă exemplu de la Apple, care demonstrează utilizarea framework-ului SystemConfiguration pentru monitorizarea rețelei. Codul sursă a fost publicat în Apple Developer Documentation ca exemplu, dar comunitatea l-a adoptat ca instrument standard de verificare a conexiunii în proiectele iOS.
Biblioteca funcționează pe baza SCNetworkReachability — o funcție C din SystemConfiguration care evaluează accesibilitatea unui host la distanță sau a unei adrese IP. La crearea Reachability se specifică fie un nume de host (de exemplu, google.com) fie o adresă IP, iar biblioteca verifică asincron dacă acest host este accesibil prin interfețele de rețea curente ale dispozitivului.
Popularitatea Reachability se explică prin simplitatea sa: este suficient să creați o instanță, să vă abonați la notificări prin NotificationCenter și să ascultați kReachabilityChangedNotification. Ca răspuns, aplicația primește statusul: NotReachable, ReachableViaWiFi sau ReachableViaWWAN (date mobile).
Reachability a apărut prima dată în iPhone OS 2 (2008) împreună cu framework-ul SystemConfiguration. Timp de zece ani a fost singura modalitate nativă de monitorizare a rețelei în iOS. Odată cu lansarea iOS 12 și a framework-ului Network, Apple recomandă NWPathMonitor ca înlocuitor, dar Reachability este încă suportată.
Multe wrappere terțe — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — folosesc mecanismul intern SCNetworkReachability. Aceste biblioteci adaugă o interfață convenabilă Swift/Objective-C, memoizarea statusului și callback-uri thread-safe, păstrând aceeași bază SystemConfiguration.
Mecanismul principal al Reachability — funcția SCNetworkReachabilityCreateWithName, care creează un obiect de urmărire pentru host-ul specificat. Apoi este apelată SCNetworkReachabilityGetFlags — o verificare sincronă care returnează o mască de biți SCNetworkReachabilityFlags cu starea curentă a rețelei.
Pentru monitorizare asincronă se folosește SCNetworkReachabilitySetCallback, care înregistrează o funcție de apel invers C. Callback-ul este executat pe RunLoop-ul curent atunci când starea de accesibilitate a host-ului se schimbă. Reachability îmbrășoară acest C-callback într-o metodă Objective-C și trimite o notificare prin 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 — masca de biți care codifică starea rețelei. Fanionul kSCNetworkReachabilityFlagsReachable indică faptul că host-ul este accesibil. kSCNetworkReachabilityFlagsConnectionRequired — pentru conexiune este necesară stabilirea legăturii. Combinația fanioanelor determină dacă aplicația poate trimite date.
Fanioane suplimentare: kSCNetworkReachabilityFlagsIsWWAN — conexiune prin rețea mobilă (iOS), kSCNetworkReachabilityFlagsInterventionRequired — necesită intervenția utilizatorului (de exemplu, pentru VPN). Reachability ia în considerare aceste fanioane pentru determinarea tipului de interfață.
Modelul standard de utilizare Reachability într-o aplicație iOS include crearea unei instanțe, abonarea la notificări și reacția la schimbarea statusului. Exemplul de mai jos arată integrarea cu NotificationCenter pentru actualizarea UI-ului la schimbarea rețelei.
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("Conectat prin Wi-Fi")
case .cellular:
print("Conectat prin rețeaua mobilă")
case .unavailable:
print("Fără conexiune")
}
}
}
}
Înainte de executarea unei cereri HTTP, se poate verifica disponibilitatea rețelei sincron: reachability.connection != .unavailable. Aceasta nu garantează succesul cererii (serverul poate fi indisponibil), dar previne cererile sortite eșecului și îmbunătățește UX-ul — aplicația nu afișează un spinner în modul offline.
Pentru o verificare mai precisă, combinați Reachability cu timeout-urile URLSession. Dacă Reachability arată reachable, dar cererea nu se execută în timpul timeout-ului — problema este probabil de partea serverului sau un portal captiv. În acest caz, puteți afișa utilizatorului un mesaj despre indisponibilitatea serverului.
Reachability diferențiază trei stări principale de conexiune: Wi-Fi, date mobile (WWAN) și indisponibilitate. WWAN include toate tipurile de comunicații mobile — 2G, 3G, 4G/LTE, 5G. Biblioteca nu oferă detalii în cadrul WWAN, prin urmare pentru diferențierea 4G și 5G este necesar CoreTelephony.
| Stare | Fanion SCNetwork | Descriere |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Conexiune prin rețea Wi-Fi cu acces la host |
| ReachableViaWWAN | Reachable + IsWWAN | Conexiune prin rețea mobilă (2G-5G) |
| NotReachable | !Reachable | Host inaccesibil prin orice interfață |
| ConnectionRequired | Reachable + ConnectionRequired | Necesită stabilirea conexiunii (VPN, PPPoE) |
Reachability nu diferențiază Ethernet, tuneluri VPN sau conexiuni multipath — toate interfețele non-WWAN sunt clasificate ca Wi-Fi. Această limitare este legată de arhitectura SystemConfiguration, care nu oferă informații detaliate despre interfețele de rețea dincolo de clasificarea de bază.
Pentru determinarea tipului specific de comunicație mobilă (4G vs 5G) este necesar CTTelephonyNetworkInfo din CoreTelephony. Combinarea Reachability cu CoreTelephony permite aplicației să aleagă calitatea conținutului: la 5G — streaming 4K, la 4G/LTE — HD, la 3G — SD sau doar audio.
Apple recomandă înlocuirea Reachability cu NWPathMonitor în toate proiectele noi, începând cu iOS 12. Motivul principal este că NWPathMonitor face parte din framework-ul modern Network, scris în Swift, suportă Combine și oferă informații detaliate despre calea rețelei fără a utiliza compatibilitatea cu C.
Procesul de migrare include înlocuirea SCNetworkReachability cu NWPathMonitor, trecerea de la NotificationCenter la pathUpdateHandler closure sau Combine publisher. Algoritmul și logica de procesare a statusului rețelei rămân aceleași — se schimbă doar API-ul de monitorizare.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// Implementare modernă folosind 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()
}
}
Pentru proiectele cu suport de bază iOS 12+, înlocuiți complet Reachability cu NWPathMonitor. Pentru proiectele care suportă iOS 11, utilizați compilare condiționată #available(iOS 12, *) cu NWPathMonitor și Reachability ca fallback. Aceasta permite migrarea treptată fără a pierde suportul pentru dispozitivele vechi.
Principalul avantaj al migrării este detalierea căii de rețea. NWPathMonitor nu raportează doar „disponibil/indisponibil”, ci și tipul fiecărei interfețe, costurile acestora, prioritatea, suportul pentru proxy și VPN. Acest lucru oferă dezvoltatorului mai multe date pentru adaptarea comportamentului aplicației la condițiile curente de rețea.
Întrebări frecvente
Reachability pe SCNetworkReachability este disponibilă începând cu iPhone OS 2 (iOS 2). Biblioteca funcționează pe toate versiunile de iOS, inclusiv cele actuale. Limitările nu țin de versiunea sistemului de operare, ci de detalierea informațiilor — pe versiunile vechi nu există diferențiere între 4G și 5G.
Reachability folosește SCNetworkReachability — un serviciu de sistem care evaluează accesibilitatea host-ului la nivelul stivei de rețea fără a trimite pachete. Ping trimite pachete ICMP și consumă trafic, iar poate fi blocat de firewall. Reachability este mai rapidă și mai sigură pentru verificări frecvente.
Da, Reachability funcționează în SwiftUI prin ObservableObject sau Combine. Îmbrășați-o într-o clasă abonată la NotificationCenter și publicați statusul prin @Published. Pentru proiectele noi SwiftUI, recomandăm NWPathMonitor cu Combine publisher pentru actualizarea reactivă a View-ului.
Reachability verifică fanionul kSCNetworkReachabilityFlagsIsWWAN în masca de biți SCNetworkReachabilityFlags. Dacă fanionul este setat — conexiunea este prin rețea mobilă (WWAN), dacă nu și host-ul este Reachable — prin Wi-Fi. Este singura modalitate de a diferenția tipurile fără CoreTelephony.
SCNetworkReachability verifică accesibilitatea host-ului la nivel de rețea, dar nu garantează funcționarea protocoalelor de nivel superior. Cauze posibile: portal captiv, blocare DNS, server proxy sau firewall. Reachability este un prim filtru, dar nu înlocuiește o cerere HTTP reală.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și