NWPathMonitor — kelas dari framework Network di iOS dan macOS untuk memantau status jalur jaringan perangkat. Menurut Apple Developer Documentation (2025), NWPathMonitor memungkinkan aplikasi melacak ketersediaan jaringan, menentukan jenis antarmuka, dan bereaksi terhadap perubahan koneksi. NWPathMonitor menyediakan informasi tentang jenis koneksi, biaya lalu lintas, dan ketersediaan internet melalui callback yang nyaman dengan NWPath.
Poin Utama
NWPathMonitor — adalah kelas dari framework Network, diperkenalkan oleh Apple di iOS 12 dan macOS 10.14 Mojave. Ini menyediakan API modern untuk melacak perubahan jalur jaringan perangkat — kombinasi antarmuka jaringan yang dilalui lalu lintas aplikasi.
Sebelum iOS 12, untuk pemantauan jaringan digunakan pustaka Reachability, yang dibangun di atas framework C SystemConfiguration. NWPathMonitor adalah alternatif native Swift dengan API yang lebih kaya, dukungan untuk jenis koneksi modern (VPN, multipath, LTE, 5G) dan kerja bawaan dengan GCD.
Perbedaan utama antara NWPathMonitor dan Reachability — objek NWPath tidak hanya memberikan status biner “tersedia/tidak tersedia”, tetapi gambaran lengkap tentang jalur: antarmuka yang digunakan, prioritasnya, biaya, status roaming, dan kemungkinan proxy dan VPN. Pengembang menerima informasi lengkap untuk mengambil keputusan tentang permintaan jaringan.
Framework Network muncul sebagai pengganti modern untuk API C tingkat rendah — CFStream dan BSD Sockets. Ini menyediakan antarmuka terpadu untuk komunikasi jaringan di semua platform Apple, termasuk watchOS dan tvOS. NWPathMonitor adalah bagian dari framework ini bersama dengan NWConnection, NWListener, dan NWBrowser.
Framework Network ditulis dalam Swift dan menggunakan GCD untuk pemrosesan asinkron. Ini berarti callback NWPathMonitor dieksekusi pada dispatch queue yang ditentukan, berintegrasi dengan arsitektur multi-threading aplikasi yang ada tanpa manajemen thread manual.
Penggunaan NWPathMonitor dimulai dengan membuat instance kelas dan mengonfigurasi handler pathUpdateHandler. Kemudian metode start dipanggil dengan menentukan dispatch queue tempat closure akan dijalankan. Penghentian pemantauan dilakukan dengan metode cancel, yang juga membebaskan sumber daya.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Jaringan tersedia")
} else {
print("Jaringan tidak tersedia")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor dapat dikonfigurasi untuk melacak hanya jenis antarmuka tertentu. Untuk ini digunakan inisialisasi NWPathMonitor(requiredInterfaceType:) dengan parameter NWInterface.InterfaceType — .wifi, .cellular, .wiredEthernet atau .loopback. Jika jenis tidak ditentukan, pemantauan dilakukan untuk semua antarmuka.
Contoh praktis: aplikasi streaming dapat melacak hanya Wi-Fi dan memperingatkan pengguna tentang peralihan ke data seluler. Pemeriksaan isConstrained dan isExpensive di NWPath memungkinkan menentukan apakah koneksi saat ini ditagih atau dibatasi kecepatannya.
Pemantauan harus dimulai saat aplikasi dimulai atau saat masuk ke latar depan dan dihentikan saat masuk ke latar belakang. Disarankan untuk membuat satu instance NWPathMonitor untuk seluruh aplikasi (singleton) dan menggunakannya dari berbagai modul melalui protokol atau lapisan layanan.
NWPath — objek yang diteruskan ke pathUpdateHandler, yang menggambarkan status saat ini dari jalur jaringan. Ini berisi lima properti kunci yang mencakup sebagian besar skenario pemantauan jaringan. NWPath.Status — enumerasi dengan tiga status: satisfied (tersedia), unsatisfied (tidak tersedia) dan requiresConnection (memerlukan koneksi).
| Properti | Tipe | Deskripsi |
|---|---|---|
| status | NWPath.Status | Status jalur saat ini: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Daftar semua antarmuka jaringan yang tersedia |
| gateways | [NWEndpoint] | Daftar gateway yang digunakan untuk routing |
| isExpensive | Bool | True jika koneksi ditagih (data seluler, hotspot pribadi) |
| isConstrained | Bool | True jika koneksi dibatasi kecepatannya (Mode Data Rendah) |
Properti isExpensive — bendera yang sangat penting untuk aplikasi yang bekerja dengan volume data besar. Jika isExpensive = true, aplikasi harus menurunkan kualitas streaming, menunda pengunduhan pembaruan, atau memperingatkan pengguna. isConstrained menunjukkan Mode Data Rendah aktif.
Untuk memeriksa ketersediaan internet (bukan hanya jaringan) digunakan metode usesInterfaceType. Jika perangkat terhubung ke Wi-Fi tanpa internet — NWPath mungkin menampilkan satisfied, tetapi akses sebenarnya tidak ada. Dalam kasus seperti itu, diperlukan validasi tambahan melalui NWConnection.
Mari kita lihat implementasi NWPathMonitor tingkat lanjut dengan penanganan biaya, jenis antarmuka, dan pemberitahuan ViewModel melalui publisher. Dalam contoh ini digunakan framework Combine untuk pembaruan UI secara reaktif saat status jaringan berubah.
import Network
import Combine
final class NetworkManager: ObservableObject {
static let shared = NetworkManager()
@Published private(set) var isConnected = true
@Published private(set) var isExpensive = false
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("NetworkMonitor")
private init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
self?.isExpensive = path.isExpensive
}
}
monitor.start(on: queue)
}
func checkInterface() -> NWInterface.InterfaceType {
let path = monitor.currentPath
if path.usesInterfaceType(.wifi) { return .wifi }
if path.usesInterfaceType(.cellular) { return .cellular }
return .other
}
}
Saat kehilangan koneksi, mungkin diperlukan tidak hanya memberi tahu UI, tetapi juga melakukan tindakan tertunda — misalnya, menyimpan draf permintaan untuk dikirim nanti. Implementasikan antrean permintaan tertunda yang mengumpulkan operasi saat status unsatisfied dan mengirimkannya saat satisfied pulih.
Untuk tugas ini, pola ReachabilityManager dengan delegasi sangat cocok: NWPathMonitor memberi tahu manajer, manajer memperbarui antrean dan UI. Saat status berubah menjadi satisfied, antrean secara otomatis dikosongkan, dan UI menerima indikasi pemulihan koneksi.
Sebelum munculnya NWPathMonitor, solusi standar untuk pemantauan jaringan di iOS adalah pustaka Reachability dari Apple (contoh dari dokumentasi), yang dibangun di atas SystemConfiguration. Perbedaan utama: Reachability bekerja melalui SCNetworkReachability dalam C, tidak mendukung jenis jaringan modern, dan hanya memberikan respons biner tentang ketersediaan.
NWPathMonitor mengatasi keterbatasan ini: ditulis dalam Swift, mendukung VPN, multipath, 5G dan LTE, memberikan informasi terperinci tentang setiap antarmuka, dan bekerja secara asinkron melalui GCD. Reachability masih digunakan dalam proyek dengan dukungan minimal iOS 11 dan lebih rendah.
| Karakteristik | NWPathMonitor | Reachability |
|---|---|---|
| Versi minimal | iOS 12 | iOS 2 |
| Bahasa | Swift (Network) | C (SystemConfiguration) |
| Jenis antarmuka | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (umum) |
| isExpensive | Ada | Tidak |
| Asinkronitas | GCD (dispatch queue) | RunLoop |
| Antarmuka ganda | Ada (multipath) | Tidak |
Jika aplikasi Anda mendukung iOS 11 dan lebih rendah, Reachability tetap menjadi satu-satunya pilihan. Untuk proyek iOS 12+ disarankan untuk segera menggunakan NWPathMonitor — ini terintegrasi lebih baik dengan kode Swift modern, Combine, dan SwiftUI.
Migrasi dari Reachability ke NWPathMonitor sederhana: cukup ganti panggilan SCNetworkReachability dengan NWPathMonitor, pertahankan logika pemrosesan yang sama. Lapisan abstraksi (protokol NetworkMonitorProtocol) akan memungkinkan perpindahan antar implementasi tanpa mengubah logika bisnis aplikasi.
Pertanyaan yang Sering Diajukan
NWPathMonitor tersedia mulai iOS 12.0, macOS 10.14, watchOS 5.0 dan tvOS 12.0. Untuk proyek yang mendukung versi lama, gunakan Reachability dari SystemConfiguration atau pustaka pembungkus dengan kompilasi bersyarat melalui #available.
Satisfied berarti lalu lintas dapat melewati setidaknya satu antarmuka. Unsatisfied — tidak ada antarmuka yang tersedia. Status requiresConnection — jalur memerlukan pembuatan koneksi (misalnya, VPN tidak terhubung), dan lalu lintas untuk sementara tidak dapat lewat.
Gunakan metode usesInterfaceType pada NWPath: path.usesInterfaceType(.wifi) untuk Wi-Fi, path.usesInterfaceType(.cellular) untuk data seluler. Metode mengembalikan true jika lalu lintas saat ini melewati jenis antarmuka yang ditentukan.
Disarankan untuk menjeda pemantauan di latar belakang untuk menghemat baterai. Memanggil monitor.cancel() di applicationDidEnterBackground dan memulai ulang di applicationWillEnterForeground mengurangi konsumsi daya. Untuk operasi kritis, gunakan Background Task.
NWPathMonitor dapat menampilkan satisfied bahkan di portal captive. Untuk menentukan akses internet yang sebenarnya, lakukan permintaan HTTP ke endpoint tepercaya melalui NWConnection. Jika ada redirect — portal aktif, diperlukan otorisasi di WebView.
Ringkasan
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