Reachability — iOS və macOS üçün SystemConfiguration çərçivəsi əsasında qurulmuş, internet bağlantısının əlçatanlığını yoxlamağa və onun dəyişikliklərini izləməyə imkan verən kitabxanadır. Apple Developer Documentation (2025)-yə görə, Reachability şəbəkənin asinxron monitorinqi üçün SCNetworkReachability istifadə edir. Reachability kitabxanası uzun müddət iOS layihələri üçün standart olaraq qalmışdır, ta ki yerli NWPathMonitor meydana çıxana qədər.
Başlıca
Reachability — şəbəkə monitorinqi üçün SystemConfiguration çərçivəsindən istifadəni nümayiş etdirən Apple-dan nümunə kitabxanadır. Mənbə kodu Apple Developer Documentation-da nümunə olaraq dərc edilmişdir, lakin icma onu iOS layihələrində bağlantı yoxlaması üçün standart alət kimi qəbul etmişdir.
Kitabxana SystemConfiguration-dan C funksiyası olan SCNetworkReachability əsasında işləyir və uzaq hostun və ya IP ünvanının əlçatanlığını qiymətləndirir. Reachability yaradılarkən ya host adı (məsələn, google.com) ya da IP ünvanı göstərilir və kitabxana asinxron olaraq yoxlayır ki, bu host cihazın cari şəbəkə interfeysləri vasitəsilə əlçatandırmı.
Reachability-in populyarlığı onun sadəliyi ilə izah olunur: sadəcə bir instansiya yaratmaq, NotificationCenter vasitəsilə bildirişlərə abunə olmaq və kReachabilityChangedNotification-u dinləmək kifayətdir. Cavab olaraq tətbiq status alır: NotReachable, ReachableViaWiFi və ya ReachableViaWWAN (mobil məlumatlar).
Reachability ilk dəfə iPhone OS 2-də (2008) SystemConfiguration çərçivəsi ilə birlikdə ortaya çıxdı. On il ərzinde iOS-da şəbəkə monitorinqinin yeganə yerli üsulu olmuşdur. iOS 12 və Network çərçivəsinin buraxılması ilə Apple NWPathMonitor-u əvəz olaraq tövsiyə edir, lakin Reachability hələ dəstəklənir.
Çoxsaylı üçüncü tərəf qapaqları — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — SCNetworkReachability daxili mexanizmindən istifadə edir. Bu kitabxanalar rahat Swift/Objective-C interfeysi, status memoizasiyası və thread-safe callbacklər əlavə edir, eyni SystemConfiguration əsasını qoruyur.
Reachability-in əsas mexanizmi — müəyyən host üçün izləmə obyekti yaradan SCNetworkReachabilityCreateWithName funksiyasıdır. Sonra SCNetworkReachabilityGetFlags çağırılır — cari şəbəkə vəziyyəti ilə SCNetworkReachabilityFlags bit maskasını qaytaran sinxron yoxlama.
Asinxron monitorinq üçün C geri çağırış funksiyasını qeydiyyatdan keçirən SCNetworkReachabilitySetCallback istifadə olunur. Callback cari RunLoop-da, hostun əlçatanlıq vəziyyəti dəyişdikdə yerinə yetirilir. Reachability bu C-callback-ı Objective-C metoduna sarır və NotificationCenter vasitəsilə bildiriş göndərir.
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 — şəbəkə vəziyyətini kodlayan bit maskasıdır. kSCNetworkReachabilityFlagsReachable bayrağı hostun əlçatan olduğunu göstərir. kSCNetworkReachabilityFlagsConnectionRequired — bağlantı üçün əlaqə qurulması tələb olunur. Bayraqların kombinasiyası tətbiqin məlumat göndərə biləcəyini müəyyən edir.
Əlavə bayraqlar: kSCNetworkReachabilityFlagsIsWWAN — mobil şəbəkə üzərindən bağlantı (iOS), kSCNetworkReachabilityFlagsInterventionRequired — istifadəçi müdaxiləsi tələb olunur (məsələn, VPN üçün). Reachability interfeys növünü müəyyən etmək üçün bu bayraqları nəzərə alır.
iOS tətbiqində Reachability-in standart istifadə nümunəsi instansiya yaratmağı, bildirişlərə abunə olmağı və status dəyişikliyinə reaksiya verməyi əhatə edir. Aşağıdakı nümunə şəbəkə dəyişərkən UI-ni yeniləmək üçün NotificationCenter ilə inteqrasiyanı göstərir.
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("Wi-Fi vasitəsilə qoşuldu")
case .cellular:
print("Mobil şəbəkə vasitəsilə qoşuldu")
case .unavailable:
print("Bağlantı yoxdur")
}
}
}
}
HTTP sorğusunu yerinə yetirməzdən əvvəl şəbəkənin əlçatanlığını sinxron yoxlamaq olar: reachability.connection != .unavailable. Bu sorğunun uğurunu təmin etmir (server əlçatan olmaya bilər), lakin əvvəlcədən uğursuz sorğuların qarşısını alır və UX-i yaxşılaşdırır — tətbiq oflayn rejimdə spinner göstərmir.
Daha dəqiq yoxlama üçün Reachability-i URLSession timeoutları ilə birləşdirin. Əgər Reachability əlçatanlıq göstərirsə, lakin sorğu timeout müddətində yerinə yetirilmirsə — problem yəqin ki, server tərəfində və ya captive portaldadır. Belə halda istifadəçiyə serverin əlçatan olmadığı barədə mesaj göstərmək olar.
Reachability üç əsas bağlantı vəziyyətini fərqləndirir: Wi-Fi, mobil məlumatlar (WWAN) və əlçatan deyil. WWAN bütün mobil rabitə növlərini əhatə edir — 2G, 3G, 4G/LTE, 5G. Kitabxana WWAN daxilində təfərrüat vermir, buna görə 4G və 5G-ni fərqləndirmək üçün CoreTelephony tələb olunur.
| Vəziyyət | SCNetwork bayrağı | Təsvir |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Host-a çıxışı olan Wi-Fi şəbəkəsi üzərindən bağlantı |
| ReachableViaWWAN | Reachable + IsWWAN | Mobil şəbəkə üzərindən bağlantı (2G-5G) |
| NotReachable | !Reachable | Host heç bir interfeys vasitəsilə əlçatan deyil |
| ConnectionRequired | Reachable + ConnectionRequired | Bağlantının qurulması tələb olunur (VPN, PPPoE) |
Reachability Ethernet, VPN tunelləri və ya multipath bağlantılarını fərqləndirmir — WWAN olmayan bütün interfeyslər Wi-Fi kimi təsnif edilir. Bu məhdudiyyət əsas təsnifatdan kənarda şəbəkə interfeysləri haqqında təfərrüatlı məlumat verməyən SystemConfiguration memarlığı ilə bağlıdır.
Mobil rabitənin konkret növünü (4G vs 5G) müəyyən etmək üçün CoreTelephony-dən CTTelephonyNetworkInfo tələb olunur. Reachability-i CoreTelephony ilə birləşdirmək tətbiqə məzmun keyfiyyətini seçməyə imkan verir: 5G-də 4K striminq, 4G/LTE-də HD, 3G-də SD və ya yalnız audio.
Apple iOS 12-dən başlayaraq bütün yeni layihələrdə Reachability-in NWPathMonitor ilə əvəz edilməsini tövsiyə edir. Əsas səbəb NWPathMonitor-un müasir Network çərçivəsinin bir hissəsi olması, Swift-də yazılması, Combine-i dəstəkləməsi və C uyğunluğu olmadan şəbəkə yolu haqqında təfərrüatlı məlumat verməsidir.
Miqrasiya prosesi SCNetworkReachability-in NWPathMonitor ilə əvəz edilməsini, NotificationCenter-dən pathUpdateHandler closure və ya Combine publisher-a keçidi əhatə edir. Şəbəkə statusunun emal alqoritmi və məntiqi eyni qalır — yalnız monitorinq API-si dəyişir.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// NWPathMonitor istifadə edən müasir tətbiq
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()
}
}
iOS 12+ əsas dəstəyi olan layihələr üçün Reachability-i tamamilə NWPathMonitor ilə əvəz edin. iOS 11-i dəstəkləyən layihələr üçün NWPathMonitor və Reachability ilə şərti kompilasiyadan #available(iOS 12, *) fallback kimi istifadə edin. Bu, köhnə cihazların dəstəyini itirmədən tədricən miqrasiya etməyə imkan verir.
Miqrasiyanın əsas üstünlüyü şəbəkə yolunun təfərrüatıdır. NWPathMonitor sadəcə „əlçatan/əlçatan deyil” deyil, həm də hər bir interfeysin növünü, onların xərclərini, prioritetini, proxy və VPN dəstəyini bildirir. Bu, tərtibatçıya tətbiqin davranışını cari şəbəkə şəraitinə uyğullaşdırmaq üçün daha çox məlumat verir.
Tez-tez verilən suallar
SCNetworkReachability əsasında Reachability iPhone OS 2 (iOS 2)-dən etibarən mövcuddur. Kitabxana bütün iOS versiyalarında, o cümlədən cari versiyalarda işləyir. Məhdudiyyətlər ƏS versiyasına deyil, məlumat təfərrüatına aiddir — köhnə versiyalarda 4G və 5G fərqləndirməsi yoxdur.
Reachability paketlər göndərmədən şəbəkə steki səviyyəsində hostun əlçatanlığını qiymətləndirən sistem xidməti olan SCNetworkReachability-dən istifadə edir. Ping ICMP paketləri göndərir və trafik sərf edir, həmçinin firewall tərəfindən bloklana bilər. Reachability tez-tez yoxlama üçün daha sürətli və təhlükəsizdir.
Bəli, Reachability ObservableObject və ya Combine vasitəsilə SwiftUI-də işləyir. Onu NotificationCenter-ə abunə olan sinfə sarın və statusu @Published vasitəsilə dərc edin. Yeni SwiftUI layihələri üçün View-in reaktiv yenilənməsi üçün Combine publisher ilə NWPathMonitor-u tövsiyə edirik.
Reachability SCNetworkReachabilityFlags bit maskasında kSCNetworkReachabilityFlagsIsWWAN bayrağını yoxlayır. Bayraq qurulubsa — bağlantı mobil şəbəkə (WWAN) üzərindəndir, yox və host Reachable-dirsə — Wi-Fi üzərindən. CoreTelephony olmadan növləri fərqləndirməyin yeganə yoludur.
SCNetworkReachability hostun şəbəkə səviyyəsində əlçatanlığını yoxlayır, lakin yuxarı səviyyəli protokolların işləməsinə zəmanət vermir. Mümkün səbəblər: captive portal, DNS blokadası, proksi server və ya firewall. Reachability ilk filtrdir, lakin real HTTP sorğusunu əvəz etmir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun