NWPathMonitor, iOS ve macOS'taki Network çerçevesinde cihazın ağ yolunun durumunu izlemek için kullanılan bir sınıftır. Apple Developer Documentation (2025)'ye göre NWPathMonitor, uygulamanın ağ kullanılabilirliğini izlemesine, arabirim türünü belirlemesine ve bağlantı değişikliklerine yanıt vermesine olanak tanır. NWPathMonitor, NWPath ile kullanışlı bir geri çağrım aracılığıyla bağlantı türü, veri maliyetleri ve internet kullanılabilirliği hakkında bilgi sağlar.
Ana Noktalar
NWPathMonitor, Apple tarafından iOS 12 ve macOS 10.14 Mojave'de tanıtılan Network çerçevesinin bir sınıfıdır. Cihazın ağ yolundaki değişiklikleri izlemek için modern bir API sağlar — uygulama trafiğinin geçtiği ağ arabirimlerinin birleşimi.
iOS 12'den önce, C tabanlı SystemConfiguration çerçevesi üzerine inşa edilmiş Reachability kütüphanesi ağ izleme için kullanılıyordu. NWPathMonitor, daha zengin bir API, modern bağlantı türleri (VPN, multipath, LTE, 5G) desteği ve yerleşik GCD entegrasyonu ile yerel bir Swift alternatifidir.
NWPathMonitor ile Reachability arasındaki temel fark — NWPath nesnesi yalnızca ikili bir “kullanılabilir/kullanılamaz” durumu değil, yolun tam bir resmini sağlar: kullanılan arabirimler, öncelikleri, maliyetler, dolaşım durumu ve proxy ve VPN yetenekleri. Geliştirici, ağ istekleri hakkında kararlar almak için kapsamlı bilgi elde eder.
Network çerçevesi, düşük seviyeli C API'lerinin — CFStream ve BSD Sockets modern bir yedeği olarak ortaya çıktı. watchOS ve tvOS dahil tüm Apple platformlarında ağ iletişimi için birleşik bir arabirim sağlar. NWPathMonitor, NWConnection, NWListener ve NWBrowser ile birlikte bu çerçevenin bir parçasıdır.
Network çerçevesi Swift ile yazılmıştır ve eşzamansız işlem için GCD kullanır. Bu, NWPathMonitor geri çağrımlarının belirtilen dispatch queue'de yürütüldüğü ve manuel iş parçacığı yönetimi olmadan uygulamanın mevcut çoklu iş parçacığı mimarisiyle entegre olduğu anlamına gelir.
NWPathMonitor kullanımı, bir sınıf örneği oluşturmak ve pathUpdateHandler geri çağrımını yapılandırmakla başlar. Ardından closure'ın yürütüleceği bir dispatch queue ile start metodu çağrılır. İzleme, kaynakları da serbest bırakan cancel metoduyla durdurulur.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Ağ kullanılabilir")
} else {
print("Ağ kullanılamaz")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor yalnızca belirli bir arabirim türünü izleyecek şekilde yapılandırılabilir. NWInterface.InterfaceType parametresi (.wifi, .cellular, .wiredEthernet veya .loopback) ile NWPathMonitor(requiredInterfaceType:) başlatıcısını kullanın. Hiçbir tür belirtilmezse, izleme tüm arabirimleri kapsar.
Pratik örnek: bir akış uygulaması yalnızca Wi-Fi'ı izleyebilir ve hücresel veriye geçiş konusunda kullanıcıyı uyarabilir. NWPath'te isConstrained ve isExpensive'i kontrol etmek, mevcut bağlantının ücretli mi yoksa hız sınırlı mı olduğunu belirlemeye olanak tanır.
İzleme, uygulama başlatıldığında veya ön plana geçildiğinde başlamalı ve arka plana geçildiğinde durmalıdır. Tüm uygulama için tek bir NWPathMonitor örneği (singleton) oluşturulması ve bir protokol veya hizmet katmanı aracılığıyla farklı modüllerden kullanılması önerilir.
NWPath, pathUpdateHandler'a iletilen ve ağ yolunun mevcut durumunu tanımlayan bir nesnedir. Çoğu ağ izleme senaryosunu kapsayan beş anahtar özellik içerir. NWPath.Status — üç durumlu bir numaralandırma: satisfied (kullanılabilir), unsatisfied (kullanılamaz) ve requiresConnection (bağlantı gerekiyor).
| Özellik | Tür | Açıklama |
|---|---|---|
| status | NWPath.Status | Mevcut yol durumu: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | Mevcut tüm ağ arabirimlerinin listesi |
| gateways | [NWEndpoint] | Yönlendirme için kullanılan ağ geçitlerinin listesi |
| isExpensive | Bool | Bağlantı ücretliyse True (hücresel veri, kişisel erişim noktası) |
| isConstrained | Bool | Bağlantı hız sınırlıysa True (Düşük Veri Modu) |
isExpensive özelliği, büyük miktarda veriyle çalışan uygulamalar için kritik bir bayraktır. isExpensive = true ise, uygulama akış kalitesini düşürmeli, güncelleme indirmelerini ertelemeli veya kullanıcıyı uyarmalıdır. isConstrained, Düşük Veri Modu'nun etkin olduğunu gösterir.
(İnternet kullanılabilirliğini (sadece ağ değil) kontrol etmek için usesInterfaceType metodunu kullanın. Cihaz internetsiz Wi-Fi'a bağlıysa — NWPath satisfied gösterebilir, ancak gerçek erişim yoktur. Bu gibi durumlarda, NWConnection üzerinden ek doğrulama gerekir.
Maliyet yönetimi, arabirim türleri ve bir yayıncı aracılığıyla ViewModel bildirimi içeren gelişmiş bir NWPathMonitor uygulamasına bakalım. Örnek, ağ durumu değiştiğinde tepkisel UI güncellemeleri için Combine çerçevesini kullanır.
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
}
}
Bağlantı kaybedildiğinde, yalnızca UI'yı bilgilendirmek değil, aynı zamanda ertelenmiş eylemler gerçekleştirmek de gerekebilir — örneğin, daha sonra göndermek için bir istek taslağı kaydetmek. unsatisfied durumu sırasında işlemleri biriktiren ve satisfied geri yüklendiğinde gönderen bir ertelenmiş istek kuyruğu uygulayın.
Bu görev için temsilci ile ReachabilityManager deseni idealdir: NWPathMonitor yöneticiyi bilgilendirir, yönetici kuyruğu ve UI'yı günceller. Durum satisfied olarak değiştiğinde, kuyruk otomatik olarak boşalır ve UI bir bağlantı geri yükleme göstergesi alır.
NWPathMonitor'dan önce, iOS'ta ağ izleme için standart çözüm, SystemConfiguration üzerine inşa edilmiş Apple'ın Reachability kütüphanesiydi (belgelerden örnek). Temel farklar: Reachability C'de SCNetworkReachability üzerinden çalışır, modern ağ türlerini desteklemez ve yalnızca ikili bir kullanılabilirlik yanıtı sağlar.
NWPathMonitor bu sınırlamaları giderir: Swift ile yazılmıştır, VPN, multipath, 5G ve LTE destekler, her arabirim hakkında ayrıntılı bilgi sağlar ve GCD üzerinden eşzamansız olarak çalışır. Reachability hala minimum iOS 11 ve altını destekleyen projelerde kullanılmaktadır.
| Özellik | NWPathMonitor | Reachability |
|---|---|---|
| Minimum sürüm | iOS 12 | iOS 2 |
| Dil | Swift (Network) | C (SystemConfiguration) |
| Arabirim türleri | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (genel) |
| isExpensive | Evet | Hayır |
| Eşzamansız | GCD (dispatch queue) | RunLoop |
| Birden çok arabirim | Evet (multipath) | Hayır |
Uygulamanız iOS 11 ve altını destekliyorsa, Reachability tek seçenek olarak kalır. iOS 12+ projeleri için doğrudan NWPathMonitor kullanılması önerilir — modern Swift kodu, Combine ve SwiftUI ile daha iyi entegre olur.
Reachability'den NWPathMonitor'a geçiş basittir: aynı işleme mantığını koruyarak SCNetworkReachability çağrılarını NWPathMonitor ile değiştirin. Bir soyutlama katmanı (NetworkMonitorProtocol), uygulamanın iş mantığını değiştirmeden uygulamalar arasında geçiş yapmayı sağlar.
Sıkça sorulan sorular
NWPathMonitor, iOS 12.0, macOS 10.14, watchOS 5.0 ve tvOS 12.0 itibarıyla kullanılabilir. Daha eski sürümleri destekleyen projeler için SystemConfiguration'dan Reachability veya #available ile koşullu derleme içeren sarmalayıcı kütüphaneler kullanın.
Satisfied, trafiğin en az bir arabirimden geçebileceği anlamına gelir. Unsatisfied — hiçbir arabirim kullanılamaz. requiresConnection durumu — yol bir bağlantı kurulmasını gerektirir (örneğin VPN bağlı değil) ve trafik geçici olarak geçemez.
NWPath'te usesInterfaceType metodunu kullanın: Wi-Fi için path.usesInterfaceType(.wifi), hücresel veri için path.usesInterfaceType(.cellular). Metot, mevcut trafik belirtilen arabirim türünden geçiyorsa true döndürür.
Pilden tasarruf etmek için arka planda izlemenin duraklatılması önerilir. applicationDidEnterBackground'da monitor.cancel() çağırmak ve applicationWillEnterForeground'da start'ı yeniden başlatmak güç tüketimini azaltır. Kritik işlemler için Background Task kullanın.
NWPathMonitor, kapsamlı bir portalla bile satisfied gösterebilir. Gerçek internet erişimini belirlemek için NWConnection üzerinden güvenilir bir uç noktaya HTTP isteği gerçekleştirin. Bir yönlendirme olursa — portal etkindir ve bir WebView'da yetkilendirme gerektirir.
Ö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