Reachability: apa itu, pustaka pemeriksaan ketersediaan jaringan

Penulis: IT Sectr Diterbitkan: 2026-03-11 Waktu membaca: 10 mnt

Reachability — pustaka untuk iOS dan macOS, dibangun di atas framework SystemConfiguration, yang memungkinkan Anda memeriksa ketersediaan koneksi internet dan melacak perubahannya. Menurut Apple Developer Documentation (2025), Reachability menggunakan SCNetworkReachability untuk pemantauan jaringan asinkron. Pustaka Reachability telah lama menjadi standar untuk proyek iOS hingga kemunculan NWPathMonitor native.

Poin Utama

  • Reachability — pembungkus di atas C-framework SystemConfiguration untuk memantau ketersediaan jaringan di iOS dan macOS.
  • SCNetworkReachability — C-API tingkat rendah yang memeriksa keterjangkauan host atau alamat jarak jauh.
  • Jenis koneksi — Reachability membedakan Wi-Fi dan data seluler (WWAN) untuk menyesuaikan perilaku aplikasi.
  • Notifikasi — melalui SCNetworkReachabilitySetCallback, pustaka berlangganan perubahan jaringan menggunakan RunLoop.
  • NWPathMonitor — alternatif modern untuk Reachability, tersedia mulai iOS 12 dan direkomendasikan oleh Apple.

Apa itu Reachability?

Reachability — adalah pustaka contoh dari Apple yang mendemonstrasikan penggunaan framework SystemConfiguration untuk pemantauan jaringan. Kode sumber dipublikasikan di Apple Developer Documentation sebagai contoh, tetapi komunitas telah mengadopsinya sebagai alat standar pemeriksaan koneksi dalam proyek iOS.

Pustaka ini bekerja berdasarkan SCNetworkReachability — fungsi C dari SystemConfiguration yang mengevaluasi keterjangkauan host jarak jauh atau alamat IP. Saat membuat Reachability, ditentukan baik nama host (misalnya, google.com) atau alamat IP, dan pustaka memeriksa secara asinkron apakah host ini dapat dijangkau melalui antarmuka jaringan perangkat saat ini.

Popularitas Reachability dijelaskan oleh kesederhanaannya: cukup buat instance, berlangganan notifikasi melalui NotificationCenter, dan dengarkan kReachabilityChangedNotification. Sebagai tanggapan, aplikasi menerima status: NotReachable, ReachableViaWiFi, atau ReachableViaWWAN (data seluler).

Sejarah dan status pustaka

Reachability pertama kali muncul di iPhone OS 2 (2008) bersama dengan framework SystemConfiguration. Selama sepuluh tahun, ini adalah satu-satunya cara native untuk memantau jaringan di iOS. Dengan dirilisnya iOS 12 dan framework Network, Apple merekomendasikan NWPathMonitor sebagai pengganti, tetapi Reachability masih didukung.

Banyak pembungkus pihak ketiga — AFNetworking, Alamofire, AshleyDodd/Reachability.swift — menggunakan mekanisme internal SCNetworkReachability. Pustaka-pustaka ini menambahkan antarmuka Swift/Objective-C yang nyaman, memoization status, dan callback thread-safe, mempertahankan basis SystemConfiguration yang sama.

Bagaimana Reachability bekerja di balik layar

Mekanisme utama Reachability — fungsi SCNetworkReachabilityCreateWithName, yang membuat objek pelacakan untuk host yang ditentukan. Kemudian SCNetworkReachabilityGetFlags dipanggil — pemeriksaan sinkron yang mengembalikan bitmask SCNetworkReachabilityFlags dengan status jaringan saat ini.

Untuk pemantauan asinkron digunakan SCNetworkReachabilitySetCallback, yang mendaftarkan fungsi panggilan balik C. Callback dijalankan pada RunLoop saat ini ketika status keterjangkauan host berubah. Reachability membungkus C-callback ini ke dalam metode Objective-C dan mengirimkan notifikasi melalui 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
    }
}

Bendera keterjangkauan jaringan

SCNetworkReachabilityFlags — bitmask yang mengkodekan status jaringan. Bendera kSCNetworkReachabilityFlagsReachable menunjukkan bahwa host dapat dijangkau. kSCNetworkReachabilityFlagsConnectionRequired — untuk koneksi diperlukan pembentukan komunikasi. Kombinasi bendera menentukan apakah aplikasi dapat mengirim data.

Bendera tambahan: kSCNetworkReachabilityFlagsIsWWAN — koneksi melalui jaringan seluler (iOS), kSCNetworkReachabilityFlagsInterventionRequired — memerlukan intervensi pengguna (misalnya, untuk VPN). Reachability memperhitungkan bendera ini untuk menentukan jenis antarmuka.

Contoh penggunaan Reachability

Pola penggunaan standar Reachability dalam aplikasi iOS mencakup pembuatan instance, berlangganan notifikasi, dan reaksi terhadap perubahan status. Contoh di bawah menunjukkan integrasi dengan NotificationCenter untuk memperbarui UI saat jaringan berubah.

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("Terhubung melalui Wi-Fi")
            case .cellular:
                print("Terhubung melalui seluler")
            case .unavailable:
                print("Tidak ada koneksi")
            }
        }
    }
}

Pemeriksaan jaringan sebelum permintaan

Sebelum melakukan permintaan HTTP, Anda dapat memeriksa ketersediaan jaringan secara sinkron: reachability.connection != .unavailable. Ini tidak menjamin keberhasilan permintaan (server mungkin tidak tersedia), tetapi mencegah permintaan yang pasti gagal dan meningkatkan UX — aplikasi tidak menampilkan spinner dalam mode offline.

Untuk pemeriksaan yang lebih akurat, gabungkan Reachability dengan timeout URLSession. Jika Reachability menunjukkan reachable tetapi permintaan tidak dijalankan dalam waktu timeout — kemungkinan masalah ada di sisi server atau portal captive. Dalam hal ini, Anda dapat menampilkan pesan kepada pengguna tentang ketidaktersediaan server.

Jenis koneksi dalam Reachability

Reachability membedakan tiga status koneksi utama: Wi-Fi, data seluler (WWAN), dan tidak tersedia. WWAN mencakup semua jenis komunikasi seluler — 2G, 3G, 4G/LTE, 5G. Pustaka tidak memberikan detail di dalam WWAN, oleh karena itu untuk membedakan 4G dan 5G diperlukan CoreTelephony.

StatusBendera SCNetworkDeskripsi
ReachableViaWiFiReachable + !IsWWANKoneksi melalui jaringan Wi-Fi dengan akses ke host
ReachableViaWWANReachable + IsWWANKoneksi melalui jaringan seluler (2G-5G)
NotReachable!ReachableHost tidak dapat dijangkau melalui antarmuka apa pun
ConnectionRequiredReachable + ConnectionRequiredDiperlukan pembentukan koneksi (VPN, PPPoE)

Keterbatasan Reachability berdasarkan jenis jaringan

Reachability tidak membedakan Ethernet, tunnel VPN, atau koneksi multipath — semua antarmuka non-WWAN diklasifikasikan sebagai Wi-Fi. Keterbatasan ini terkait dengan arsitektur SystemConfiguration, yang tidak memberikan informasi terperinci tentang antarmuka jaringan di luar klasifikasi dasar.

Untuk menentukan jenis komunikasi seluler tertentu (4G vs 5G) diperlukan CTTelephonyNetworkInfo dari CoreTelephony. Menggabungkan Reachability dengan CoreTelephony memungkinkan aplikasi memilih kualitas konten: pada 5G — streaming 4K, pada 4G/LTE — HD, pada 3G — SD atau hanya audio.

Migrasi dari Reachability ke NWPathMonitor

Apple merekomendasikan untuk mengganti Reachability dengan NWPathMonitor di semua proyek baru, mulai dari iOS 12. Alasan utamanya adalah NWPathMonitor adalah bagian dari framework Network modern, ditulis dalam Swift, mendukung Combine, dan memberikan informasi terperinci tentang jalur jaringan tanpa menggunakan kompatibilitas C.

Proses migrasi mencakup penggantian SCNetworkReachability dengan NWPathMonitor, transisi dari NotificationCenter ke pathUpdateHandler closure atau Combine publisher. Algoritme dan logika pemrosesan status jaringan tetap sama — hanya API pemantauan yang berubah.

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

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

// Implementasi modern menggunakan 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()
    }
}

Rekomendasi migrasi

Untuk proyek dengan dukungan dasar iOS 12+, ganti Reachability sepenuhnya dengan NWPathMonitor. Untuk proyek yang mendukung iOS 11, gunakan kompilasi bersyarat #available(iOS 12, *) dengan NWPathMonitor dan Reachability sebagai fallback. Ini memungkinkan migrasi bertahap tanpa kehilangan dukungan untuk perangkat lama.

Keuntungan utama migrasi adalah detail jalur jaringan. NWPathMonitor tidak hanya melaporkan “tersedia/tidak tersedia”, tetapi juga jenis setiap antarmuka, biayanya, prioritas, dukungan proxy dan VPN. Ini memberikan lebih banyak data kepada pengembang untuk menyesuaikan perilaku aplikasi dengan kondisi jaringan saat ini.

Pertanyaan yang Sering Diajukan

Versi iOS minimum apa yang mendukung Reachability?

Reachability pada SCNetworkReachability tersedia mulai iPhone OS 2 (iOS 2). Pustaka ini berfungsi di semua versi iOS, termasuk yang terbaru. Keterbatasan tidak terkait dengan versi OS, melainkan dengan detail informasi — pada versi lama tidak ada pembedaan 4G dan 5G.

Apa perbedaan Reachability dengan pemeriksaan ping sederhana?

Reachability menggunakan SCNetworkReachability — layanan sistem yang mengevaluasi keterjangkauan host di tingkat tumpukan jaringan tanpa mengirim paket. Ping mengirim paket ICMP dan menghabiskan lalu lintas, serta dapat diblokir oleh firewall. Reachability lebih cepat dan lebih aman untuk pemeriksaan yang sering.

Bisakah Reachability digunakan dalam proyek SwiftUI?

Ya, Reachability berfungsi di SwiftUI melalui ObservableObject atau Combine. Bungkus dalam kelas yang berlangganan NotificationCenter dan publikasikan status melalui @Published. Untuk proyek SwiftUI baru, kami merekomendasikan NWPathMonitor dengan Combine publisher untuk pembaruan View yang reaktif.

Bagaimana Reachability membedakan Wi-Fi vs data seluler?

Reachability memeriksa bendera kSCNetworkReachabilityFlagsIsWWAN dalam bitmask SCNetworkReachabilityFlags. Jika bendera diatur — koneksi melalui jaringan seluler (WWAN), jika tidak dan host Reachable — melalui Wi-Fi. Ini adalah satu-satunya cara untuk membedakan jenis tanpa CoreTelephony.

Mengapa Reachability menunjukkan ketersediaan, tetapi permintaan tidak berfungsi?

SCNetworkReachability memeriksa keterjangkauan host di tingkat jaringan, tetapi tidak menjamin berfungsinya protokol tingkat yang lebih tinggi. Kemungkinan penyebab: portal captive, blokade DNS, server proxy, atau firewall. Reachability adalah filter pertama, tetapi bukan pengganti permintaan HTTP yang sebenarnya.

Kesimpulan

  • Reachability — pustaka pada SystemConfiguration untuk pemantauan jaringan iOS, bekerja melalui SCNetworkReachability C-API.
  • Tiga status — Wi-Fi, data seluler (WWAN), dan tidak tersedia — ditentukan oleh bendera bit SCNetworkReachabilityFlags.
  • Notifikasi asinkron diimplementasikan melalui SCNetworkReachabilitySetCallback dengan RunLoop dan NotificationCenter.
  • Keterbatasan — Reachability tidak membedakan 4G/5G, VPN, Ethernet, dan tidak memberikan informasi tentang biaya lalu lintas.
  • NWPathMonitor — pengganti modern Reachability untuk iOS 12+, menyediakan NWPath terperinci dengan jenis, biaya, dan multipath.
  • Migrasi mencakup penggantian SCNetworkReachability dengan NWPathMonitor dengan mempertahankan logika melalui protokol NetworkMonitorProtocol.
  • Reachability tetap diperlukan untuk proyek dengan dukungan iOS 11 dan di bawahnya atau untuk pemeriksaan sinkron cepat.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga