Reachability: nedir, ağ kullanılabilirliği denetim kütüphanesi

Yazar: IT Sectr Yayınlanma: 2026-03-11 Okuma süresi: 10 dk

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 — iOS ve macOS'ta ağ kullanılabilirliğini izlemek için C framework'ü SystemConfiguration üzerine bir sarmalayıcı.
  • SCNetworkReachability — uzak bir ana bilgisayarın veya adresin erişilebilirliğini kontrol eden düşük seviyeli bir C-API.
  • Bağlantı türleri — Reachability, uygulama davranışını uyarlamak için Wi-Fi ve hücresel veri (WWAN) arasında ayrım yapar.
  • Bildirimler — SCNetworkReachabilitySetCallback aracılığıyla kütüphane, RunLoop kullanarak ağ değişikliklerine abone olur.
  • NWPathMonitor — iOS 12'den itibaren kullanılabilen ve Apple tarafından önerilen Reachability'nin modern bir alternatifi.

Reachability Nedir?

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).

Kütüphanenin Tarihi ve Durumu

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 Dahili Olarak Nasıl Çalışır

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.

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

Ağ Erişilebilirlik Bayrakları

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.

Reachability Kullanım Örnekleri

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.

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("Wi-Fi üzerinden bağlı")
            case .cellular:
                print("Hücresel üzerinden bağlı")
            case .unavailable:
                print("Bağlantı yok")
            }
        }
    }
}

İstekten Önce Ağ Kontrolü

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'de Bağlantı Türleri

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.

DurumSCNetwork BayrağıAçıklama
ReachableViaWiFiReachable + !IsWWANAna bilgisayar erişimi olan Wi-Fi ağı üzerinden bağlantı
ReachableViaWWANReachable + IsWWANHücresel ağ (2G-5G) üzerinden bağlantı
NotReachable!ReachableAna bilgisayar hiçbir arayüz üzerinden erişilemez
ConnectionRequiredReachable + ConnectionRequiredBağlantı kurulumu gerekli (VPN, PPPoE)

Ağ Türlerine Göre Reachability Sınırlamaları

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.

Reachability'den NWPathMonitor'a Geçiş

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.

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

Geçiş Önerileri

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

Reachability'yi destekleyen minimum iOS sürümü nedir?

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 basit bir ping kontrolünden nasıl farklıdır?

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.

Reachability SwiftUI projelerinde kullanılabilir mi?

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 Wi-Fi ve hücresel veriyi nasıl ayırt eder?

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.

Reachability bağlantı gösterirken neden istekler başarısız olur?

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

  • Reachability — SCNetworkReachability C-API aracılığıyla çalışan, SystemConfiguration tabanlı iOS ağ izleme kütüphanesi.
  • Üç durum — Wi-Fi, hücresel veri (WWAN) ve kullanılamaz — SCNetworkReachabilityFlags bit bayrakları aracılığıyla belirlenir.
  • Asenkron bildirimler RunLoop ve NotificationCenter ile SCNetworkReachabilitySetCallback aracılığıyla uygulanır.
  • Sınırlamalar — Reachability 4G/5G, VPN, Ethernet'i ayırt etmez ve trafik maliyeti bilgisi sağlamaz.
  • NWPathMonitor — iOS 12+ için Reachability'nin modern yedeği, tür, maliyetler ve çoklu yol ile ayrıntılı NWPath sağlar.
  • Geçiş, NetworkMonitorProtocol aracılığıyla mantığı korurken SCNetworkReachability'nin NWPathMonitor ile değiştirilmesini içerir.
  • Reachability iOS 11 ve altını destekleyen projeler veya hızlı senkron kontroller için geçerliliğini korur.

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.

Projeyi tartış

Ayrıca okuyun