Reachability, SystemConfiguration framework'ü üzerine inşa edilmiş iOS ve macOS için bir kütüphanedir; internet bağlantısının kullanılabilirliğini kontrol etmeye ve değişikliklerini izlemeye olanak tanır. Apple Developer Dokümantasyonu (2025)'na göre Reachability, asenkron ağ izleme için SCNetworkReachability kullanır. Reachability kütüphanesi, yerel NWPathMonitor ortaya çıkana kadar uzun süre iOS projeleri için standart olarak kaldı.
Önemli Noktalar
Reachability, ağ izleme için SystemConfiguration framework'ünün kullanımını gösteren Apple'dan bir örnek kütüphanedir. Kaynak kodu Apple Developer Dokümantasyonu'nda bir örnek olarak yayınlandı, ancak topluluk onu iOS projelerinde bağlantı kontrolü için standart bir araç olarak benimsedi.
Kütüphane SCNetworkReachability — SystemConfiguration'dan uzak bir ana bilgisayarın veya IP adresinin erişilebilirliğini değerlendiren bir C işlevi — üzerine kuruludur. Reachability oluşturulurken bir ana bilgisayar adı (örneğin google.com) veya bir IP adresi belirtilir ve kütüphane asenkron olarak bu ana bilgisayarın cihazın mevcut ağ arayüzleri üzerinden erişilebilir olup olmadığını kontrol eder.
Reachability'nin popülerliği basitliğinden kaynaklanır: sadece bir örnek oluşturun, NotificationCenter aracılığıyla bildirimlere abone olun ve kReachabilityChangedNotification'ı dinleyin. Yanıt olarak uygulama bir durum alır: NotReachable, ReachableViaWiFi veya ReachableViaWWAN (hücresel veri).
Reachability ilk olarak iPhone OS 2'de (2008) SystemConfiguration framework'ü ile birlikte ortaya çıktı. On yıl boyunca iOS'ta ağ durumunu izlemenin tek yerel yolu oldu. iOS 12 ve Network framework'ünün piyasaya sürülmesiyle Apple, NWPathMonitor'u bir yedek olarak öneriyor, ancak Reachability hala destekleniyor.
Birçok üçüncü taraf sarmalayıcı — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — dahili SCNetworkReachability mekanizmasını kullanır. Bu kütüphaneler kullanışlı bir Swift/Objective-C arayüzü, durum belleğe alma ve iş parçacığı güvenli geri çağırmalar eklerken aynı SystemConfiguration tabanını korur.
Reachability'nin ana mekanizması, belirtilen ana bilgisayar için bir izleme nesnesi oluşturan SCNetworkReachabilityCreateWithName işlevidir. Ardından SCNetworkReachabilityGetFlags çağrılır — geçerli ağ durumuyla SCNetworkReachabilityFlags'in bir bit maskesini döndüren senkron bir kontrol.
Asenkron izleme için, bir C geri çağırma işlevi kaydeden SCNetworkReachabilitySetCallback kullanılır. Ana bilgisayarın erişilebilirlik durumu değiştiğinde geri çağırma geçerli RunLoop'ta yürütülür. Reachability bu C geri çağırmasını bir Objective-C yöntemine sarar ve NotificationCenter aracılığıyla bir bildirim gönderir.
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, ağ durumunu kodlayan bir bit maskesidir. kSCNetworkReachabilityFlagsReachable bayrağı, ana bilgisayarın erişilebilir olduğunu gösterir. kSCNetworkReachabilityFlagsConnectionRequired — bir bağlantı kurulması gerekiyor. Bayrakların kombinasyonu, uygulamanın veri gönderip gönderemeyeceğini belirler.
Ek bayraklar: kSCNetworkReachabilityFlagsIsWWAN — hücresel ağ (iOS) üzerinden bağlantı, kSCNetworkReachabilityFlagsInterventionRequired — kullanıcı müdahalesi gerekli (örneğin VPN için). Reachability, arayüz türünü belirlemek için bu bayrakları dikkate alır.
Bir iOS uygulamasında Reachability kullanımının standart deseni, bir örnek oluşturma, bildirimlere abone olma ve durum değişikliklerine tepki vermeyi içerir. Aşağıdaki örnek, ağ değiştiğinde kullanıcı arayüzünü güncellemek için NotificationCenter ile entegrasyonu gösterir.
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 üzerinden bağlı")
case .cellular:
print("Hücresel üzerinden bağlı")
case .unavailable:
print("Bağlantı yok")
}
}
}
}
Bir HTTP isteği yapmadan önce, ağ kullanılabilirliği senkron olarak kontrol edilebilir: reachability.connection != .unavailable. Bu, isteğin başarısını garanti etmez (sunucu kullanılamayabilir), ancak kesinlikle başarısız olacak istekleri önler ve UX'i iyileştirir — uygulama çevrimdışı modda bir döndürücü göstermez.
Daha doğru bir kontrol için Reachability'yi URLSession zaman aşımları ile birleştirin. Reachability erişilebilir gösteriyor ancak istek zaman aşımı içinde başarısız oluyorsa — muhtemelen bir sunucu tarafı sorunu veya kaptif portal vardır. Bu durumda, kullanıcıya sunucu kullanılamıyor mesajı gösterilebilir.
Reachability üç ana bağlantı durumunu ayırt eder: Wi-Fi, hücresel veri (WWAN) ve kullanılamaz. WWAN, tüm hücresel bağlantı türlerini içerir — 2G, 3G, 4G/LTE, 5G. Kütüphane WWAN içinde ayrıntı sağlamaz, bu nedenle 4G ve 5G'yi ayırt etmek için CoreTelephony gerekir.
| Durum | SCNetwork Bayrağı | Açıklama |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Ana bilgisayar erişimi olan Wi-Fi ağı üzerinden bağlantı |
| ReachableViaWWAN | Reachable + IsWWAN | Hücresel ağ (2G-5G) üzerinden bağlantı |
| NotReachable | !Reachable | Ana bilgisayar hiçbir arayüz üzerinden erişilemez |
| ConnectionRequired | Reachable + ConnectionRequired | Bağlantı kurulumu gerekli (VPN, PPPoE) |
Reachability, Ethernet, VPN tünelleri veya çoklu yol bağlantılarını ayırt etmez — WWAN olmayan tüm arayüzler Wi-Fi olarak sınıflandırılır. Bu sınırlama, temel sınıflandırmanın ötesinde ağ arayüzleri hakkında ayrıntılı bilgi sağlamayan SystemConfiguration mimarisinden kaynaklanır.
Belirli hücresel bağlantı türünü (4G vs 5G) belirlemek için CoreTelephony'den CTTelephonyNetworkInfo gerekir. Reachability'yi CoreTelephony ile birleştirmek, uygulamanın içerik kalitesini seçmesine olanak tanır: 5G'de — 4K akış, 4G/LTE'de — HD, 3G'de — SD veya yalnızca ses.
Apple, iOS 12'den itibaren tüm yeni projelerde Reachability'nin NWPathMonitor ile değiştirilmesini önerir. Ana neden, NWPathMonitor'un modern Network framework'ünün bir parçası olması, Swift'te yazılması, Combine'ı desteklemesi ve C uyumluluğu olmadan ayrıntılı ağ yolu bilgisi sağlamasıdır.
Geçiş süreci, SCNetworkReachability'nin NWPathMonitor ile değiştirilmesini, NotificationCenter'dan bir pathUpdateHandler closure veya Combine yayıncısına geçişi içerir. Ağ durumu işleme algoritması ve mantığı aynı kalır — yalnızca izleme API'si değişir.
protocol NetworkMonitorProtocol {
var isReachable: Bool { get }
var connectionType: ConnectionType { get }
func startMonitoring()
func stopMonitoring()
}
enum ConnectionType {
case wifi, cellular, ethernet, unavailable
}
// NWPathMonitor kullanan modern uygulama
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+ desteği olan projeler için Reachability'yi tamamen NWPathMonitor ile değiştirin. iOS 11'i destekleyen projeler için NWPathMonitor ile koşullu derleme #available(iOS 12, *) kullanın ve Reachability'yi yedek olarak kullanın. Bu, eski cihazların desteğini kaybetmeden kademeli geçişe olanak tanır.
Geçişin ana avantajı ağ yolu ayrıntısıdır. NWPathMonitor yalnızca “erişilebilir/erişilemez” değil, aynı zamanda her arayüzün türünü, maliyetlerini, önceliğini, proxy ve VPN desteğini de bildirir. Bu, geliştiriciye uygulama davranışını mevcut ağ koşullarına uyarlamak için daha fazla veri sağlar.
Sıkça Sorulan Sorular
SCNetworkReachability tabanlı Reachability, iPhone OS 2 (iOS 2)'den itibaren kullanılabilir. Kütüphane, güncel sürümler dahil olmak üzere tüm iOS sürümlerinde çalışır. Sınırlamalar işletim sistemi sürümüyle değil, bilgi ayrıntısıyla ilgilidir — eski sürümler 4G ve 5G'yi ayırt edemez.
Reachability, paket göndermeden ağ yığını seviyesinde ana bilgisayar erişilebilirliğini değerlendiren bir sistem hizmeti olan SCNetworkReachability'yi kullanır. Ping ICMP paketleri gönderir ve trafik tüketir, ayrıca bir güvenlik duvarı tarafından engellenebilir. Reachability sık kontroller için daha hızlı ve güvenlidir.
Evet, Reachability ObservableObject veya Combine aracılığıyla SwiftUI'de çalışır. NotificationCenter'a abone olan bir sınıfa sarın ve durumu @Published aracılığıyla yayınlayın. Yeni SwiftUI projeleri için, reaktif View güncellemeleri için Combine yayıncısı ile NWPathMonitor'u öneririz.
Reachability, SCNetworkReachabilityFlags bit maskesindeki kSCNetworkReachabilityFlagsIsWWAN bayrağını kontrol eder. Bayrak ayarlanmışsa — bağlantı hücresel ağ (WWAN) üzerinden, ayarlanmamışsa ve ana bilgisayar Reachable ise — Wi-Fi üzerinden. CoreTelephony olmadan türleri ayırt etmenin tek yolu budur.
SCNetworkReachability, ana bilgisayar erişilebilirliğini ağ katmanında kontrol eder ancak üst düzey protokollerin çalışmasını garanti etmez. Olası nedenler: kaptif portal, DNS engelleme, proxy sunucusu veya güvenlik duvarı. Reachability ilk filtredir ancak gerçek bir HTTP isteğinin yerini tutmaz.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun