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 — 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).
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.
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.
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 — 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.
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.
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")
}
}
}
}
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.
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.
| Status | Bendera SCNetwork | Deskripsi |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | Koneksi melalui jaringan Wi-Fi dengan akses ke host |
| ReachableViaWWAN | Reachable + IsWWAN | Koneksi melalui jaringan seluler (2G-5G) |
| NotReachable | !Reachable | Host tidak dapat dijangkau melalui antarmuka apa pun |
| ConnectionRequired | Reachable + ConnectionRequired | Diperlukan pembentukan koneksi (VPN, PPPoE) |
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.
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.
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()
}
}
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
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.
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.
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.
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.
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
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.
Baca juga