NWPathMonitor — کلاسی از فریمورک Network در iOS و macOS برای مانیتورینگ وضعیت مسیر شبکه دستگاه است. طبق Apple Developer Documentation (2025)، NWPathMonitor به برنامه اجازه میدهد دسترسی به شبکه را ردیابی کند، نوع رابط را تعیین کند و به تغییرات اتصال واکنش نشان دهد. NWPathMonitor اطلاعاتی درباره نوع اتصال، هزینههای ترافیک و وجود اینترنت از طریق callback راحت با NWPath فراهم میکند.
نکات اصلی
NWPathMonitor — کلاسی از فریمورک Network است که توسط Apple در iOS 12 و macOS 10.14 Mojave معرفی شد. این کلاس API مدرنی برای ردیابی تغییرات مسیر شبکه دستگاه — ترکیبی از رابطهای شبکهای که ترافیک برنامه از طریق آنها عبور میکند — فراهم میکند.
پیش از iOS 12 برای مانیتورینگ شبکه از کتابخانه Reachability استفاده میشد که بر پایه فریمورک C SystemConfiguration ساخته شده بود. NWPathMonitor جایگزین بومی Swift با API غنیتر، پشتیبانی از انواع مدرن اتصال (VPN، multipath، LTE، 5G) و کار داخلی با GCD است.
تفاوت کلیدی NWPathMonitor با Reachability — شیء NWPath نه فقط یک وضعیت باینری «در دسترس/غیرقابل دسترس»، بلکه تصویر کاملی از مسیر ارائه میدهد: رابطهای استفاده شده، اولویت آنها، هزینهها، وضعیت رومینگ و امکان پروکسی و VPN. توسعهدهنده اطلاعات جامعی برای تصمیمگیری درباره درخواستهای شبکه دریافت میکند.
فریمورک Network به عنوان جایگزین مدرن برای APIهای سطح پایین C — CFStream و BSD Sockets — ظهور کرد. این فریمورک رابط یکپارچهای برای ارتباطات شبکه در تمام پلتفرمهای Apple از جمله watchOS و tvOS فراهم میکند. NWPathMonitor بخشی از این فریمورک در کنار NWConnection، NWListener و NWBrowser است.
فریمورک Network به زبان Swift نوشته شده و از GCD برای پردازش ناهمزمان استفاده میکند. این بدان معناست که callbackهای NWPathMonitor در dispatch queue مشخص شده اجرا میشوند و با معماری چندنخی موجود برنامه بدون مدیریت دستی نخها ادغام میشوند.
استفاده از NWPathMonitor با ایجاد یک نمونه از کلاس و پیکربندی handler pathUpdateHandler آغاز میشود. سپس متود start با مشخص کردن dispatch queue که closure روی آن اجرا میشود فراخوانی میگردد. توقف مانیتورینگ با متود cancel انجام میشود که منابع را نیز آزاد میکند.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("شبکه در دسترس")
} else {
print("شبکه در دسترس نیست")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor را میتوان برای ردیابی فقط یک نوع رابط خاص پیکربندی کرد. برای این کار از مقداردهنده اولیه NWPathMonitor(requiredInterfaceType:) با پارامتر NWInterface.InterfaceType — .wifi، .cellular، .wiredEthernet یا .loopback استفاده میشود. اگر نوع مشخص نشود، مانیتورینگ برای همه رابطها انجام میشود.
مثال عملی: برنامه استریمینگ میتواند فقط Wi-Fi را ردیابی کرده و کاربر را درباره انتقال به دادههای سلولی هشدار دهد. بررسی isConstrained و isExpensive در NWPath به شما امکان میدهد تعیین کنید آیا اتصال فعلی تعرفهگذاری شده یا از نظر سرعت محدود است.
مانیتورینگ باید هنگام راهاندازی برنامه یا ورود به پیشزمینه شروع شود و هنگام رفتن به پسزمینه متوقف گردد. توصیه میشود یک نمونه NWPathMonitor برای کل برنامه (singleton) ایجاد کرده و از آن از طریق پروتکل یا لایه سرویس در ماژولهای مختلف استفاده کنید.
NWPath — شیءای است که به pathUpdateHandler ارسال میشود و وضعیت فعلی مسیر شبکه را توصیف میکند. این شیء دارای پنج ویژگی کلیدی است که بیشتر سناریوهای مانیتورینگ شبکه را پوشش میدهد. NWPath.Status — شمارشی با سه حالت: satisfied (در دسترس)، unsatisfied (غیرقابل دسترس) و requiresConnection (نیاز به اتصال دارد).
| ویژگی | نوع | توضیحات |
|---|---|---|
| status | NWPath.Status | وضعیت فعلی مسیر: satisfied، unsatisfied، requiresConnection |
| availableInterfaces | [NWInterface] | فهرست تمام رابطهای شبکه موجود |
| gateways | [NWEndpoint] | فهرست دروازههای استفاده شده برای مسیریابی |
| isExpensive | Bool | True اگر اتصال تعرفهگذاری شده است (دادههای سلولی، هاتاسپوت شخصی) |
| isConstrained | Bool | True اگر اتصال از نظر سرعت محدود است (حالت داده کم) |
ویژگی isExpensive — پرچمی حیاتی برای برنامههایی که با حجم زیادی از داده کار میکنند. اگر isExpensive = true باشد، برنامه باید کیفیت استریمینگ را کاهش دهد، دانلود بهروزرسانیها را به تأخیر بیندازد یا به کاربر هشدار دهد. isConstrained نشاندهنده فعال بودن حالت Low Data Mode است.
برای بررسی دسترسی به اینترنت (نه فقط شبکه) از متود usesInterfaceType استفاده میشود. اگر دستگاه به Wi-Fi بدون اینترنت متصل باشد — NWPath ممکن است satisfied نشان دهد، اما دسترسی واقعی وجود ندارد. در چنین مواردی اعتبارسنجی اضافی از طریق NWConnection مورد نیاز است.
بیایید پیادهسازی پیشرفته NWPathMonitor با مدیریت هزینهها، انواع رابط و اطلاعرسانی به ViewModel از طریق publisher را بررسی کنیم. در این مثال از فریمورک Combine برای بهروزرسانی واکنشگرای UI هنگام تغییر وضعیت شبکه استفاده شده است.
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
}
}
هنگام قطع اتصال ممکن است نه تنها نیاز به اطلاعرسانی UI، بلکه انجام اقدامات تأخیری باشد — مثلاً ذخیره پیشنویس درخواست برای ارسال بعدی. یک صف درخواستهای تأخیری پیادهسازی کنید که عملیات را در وضعیت unsatisfed جمع کرده و پس از بازیابی satisfied ارسال میکند.
برای این کار الگوی ReachabilityManager با delegate ایدهآل است: NWPathMonitor به مدیر اطلاع میدهد، مدیر صف و UI را بهروزرسانی میکند. هنگام تغییر وضعیت به satisfied صف به طور خودکار تخلیه میشود و UI نشانه بازیابی اتصال را دریافت میکند.
پیش از ظهور NWPathMonitor راهحل استاندارد برای مانیتورینگ شبکه در iOS کتابخانه Reachability اپل (نمونه از مستندات) بود که بر پایه SystemConfiguration ساخته شده بود. تفاوتهای اصلی: Reachability از طریق SCNetworkReachability به زبان C کار میکند، از انواع مدرن شبکه پشتیبانی نمیکند و فقط پاسخ باینری درباره دسترسی میدهد.
NWPathMonitor این محدودیتها را حل میکند: به زبان Swift نوشته شده، از VPN، multipath، 5G و LTE پشتیبانی میکند، اطلاعات دقیقی درباره هر رابط ارائه میدهد و به صورت ناهمزمان از طریق GCD کار میکند. Reachability همچنان در پروژههایی با پشتیبانی حداقلی از iOS 11 و پایینتر استفاده میشود.
| ویژگی | NWPathMonitor | Reachability |
|---|---|---|
| حداقل نسخه | iOS 12 | iOS 2 |
| زبان | Swift (Network) | C (SystemConfiguration) |
| انواع رابط | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN (عمومی) |
| isExpensive | دارد | ندارد |
| ناهمزمانی | GCD (dispatch queue) | RunLoop |
| رابطهای چندگانه | دارد (multipath) | ندارد |
اگر برنامه شما از iOS 11 و پایینتر پشتیبانی میکند، Reachability تنها گزینه باقی میماند. برای پروژههای iOS 12+ توصیه میشود مستقیماً از NWPathMonitor استفاده کنید — این کلاس با کد مدرن Swift، Combine و SwiftUI بهتر یکپارچه میشود.
مهاجرت از Reachability به NWPathMonitor ساده است: کافی است فراخوانیهای SCNetworkReachability را با NWPathMonitor جایگزین کنید و همان منطق پردازش را حفظ نمایید. لایه انتزاع (پروتکل NetworkMonitorProtocol) امکان جابجایی بین پیادهسازیها را بدون تغییر منطق تجاری برنامه فراهم میکند.
سوالات متداول
NWPathMonitor از iOS 12.0، macOS 10.14، watchOS 5.0 و tvOS 12.0 در دسترس است. برای پروژههایی که از نسخههای قدیمیتر پشتیبانی میکنند، از Reachability از SystemConfiguration یا کتابخانههای wrapper با کامپایل شرطی از طریق #available استفاده کنید.
Satisfied به این معنی است که ترافیک میتواند از طریق حداقل یک رابط عبور کند. Unsatisfied — هیچ رابطی در دسترس نیست. وضعیت requiresConnection — مسیر نیاز به برقراری اتصال دارد (مثلاً VPN متصل نیست) و ترافیک موقتاً عبور نمیکند.
از متود usesInterfaceType روی NWPath استفاده کنید: path.usesInterfaceType(.wifi) برای Wi-Fi، path.usesInterfaceType(.cellular) برای دادههای سلولی. متود true برمیگرداند اگر ترافیک فعلی از نوع رابط مشخص شده عبور کند.
توصیه میشود برای صرفهجویی در باتری مانیتورینگ را در پسزمینه متوقف کنید. فراخوانی monitor.cancel() در applicationDidEnterBackground و start مجدد در applicationWillEnterForeground مصرف انرژی را کاهش میدهد. برای عملیات حیاتی از Background Task استفاده کنید.
NWPathMonitor ممکن است حتی در پرتال captive وضعیت satisfied را نشان دهد. برای تعیین دسترسی واقعی به اینترنت، یک درخواست HTTP به endpoint معتمد از طریق NWConnection انجام دهید. اگر ریدایرکت دریافت شد — پرتال فعال است و مجوز در WebView مورد نیاز است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید