NWPathMonitor: چیست، ردیابی شبکه و کار در iOS

نویسنده: IT Sectr منتشر شده: 2026-03-10 زمان مطالعه: 9 دقیقه

NWPathMonitor — کلاسی از فریم‌ورک Network در iOS و macOS برای مانیتورینگ وضعیت مسیر شبکه دستگاه است. طبق Apple Developer Documentation (2025)، NWPathMonitor به برنامه اجازه می‌دهد دسترسی به شبکه را ردیابی کند، نوع رابط را تعیین کند و به تغییرات اتصال واکنش نشان دهد. NWPathMonitor اطلاعاتی درباره نوع اتصال، هزینه‌های ترافیک و وجود اینترنت از طریق callback راحت با NWPath فراهم می‌کند.

نکات اصلی

  • NWPathMonitor — کلاس فریم‌ورک Network برای مانیتورینگ ناهمزمان مسیر شبکه در iOS و macOS.
  • NWPath حاوی اطلاعاتی درباره دسترسی به شبکه، نوع رابط (Wi-Fi، داده‌های سلولی، Ethernet) و وضعیت هزینه‌ها است.
  • متود start مانیتورینگ را در صف dispatch queue مشخص شده آغاز می‌کند، متود cancel آن را متوقف می‌کند.
  • ویژگی pathUpdateHandler — closure که با هر تغییر وضعیت مسیر شبکه فراخوانی می‌شود.
  • NWPathMonitor فیلتر کردن بر اساس نوع رابط مورد نیاز را از طریق پارامتر requiredInterfaceType پشتیبانی می‌کند.

NWPathMonitor چیست؟

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

فریم‌ورک Network به عنوان جایگزین مدرن برای APIهای سطح پایین C — CFStream و BSD Sockets — ظهور کرد. این فریم‌ورک رابط یکپارچه‌ای برای ارتباطات شبکه در تمام پلتفرم‌های Apple از جمله watchOS و tvOS فراهم می‌کند. NWPathMonitor بخشی از این فریم‌ورک در کنار NWConnection، NWListener و NWBrowser است.

فریم‌ورک Network به زبان Swift نوشته شده و از GCD برای پردازش ناهمزمان استفاده می‌کند. این بدان معناست که callbackهای NWPathMonitor در dispatch queue مشخص شده اجرا می‌شوند و با معماری چندنخی موجود برنامه بدون مدیریت دستی نخ‌ها ادغام می‌شوند.

چگونه از NWPathMonitor در برنامه استفاده کنیم

استفاده از NWPathMonitor با ایجاد یک نمونه از کلاس و پیکربندی handler pathUpdateHandler آغاز می‌شود. سپس متود start با مشخص کردن dispatch queue که closure روی آن اجرا می‌شود فراخوانی می‌گردد. توقف مانیتورینگ با متود cancel انجام می‌شود که منابع را نیز آزاد می‌کند.

swift
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

NWPath — شیءای است که به pathUpdateHandler ارسال می‌شود و وضعیت فعلی مسیر شبکه را توصیف می‌کند. این شیء دارای پنج ویژگی کلیدی است که بیشتر سناریوهای مانیتورینگ شبکه را پوشش می‌دهد. NWPath.Status — شمارشی با سه حالت: satisfied (در دسترس)، unsatisfied (غیرقابل دسترس) و requiresConnection (نیاز به اتصال دارد).

ویژگینوعتوضیحات
statusNWPath.Statusوضعیت فعلی مسیر: satisfied، unsatisfied، requiresConnection
availableInterfaces[NWInterface]فهرست تمام رابط‌های شبکه موجود
gateways[NWEndpoint]فهرست دروازه‌های استفاده شده برای مسیریابی
isExpensiveBoolTrue اگر اتصال تعرفه‌گذاری شده است (داده‌های سلولی، هات‌اسپوت شخصی)
isConstrainedBoolTrue اگر اتصال از نظر سرعت محدود است (حالت داده کم)

بررسی هزینه‌ها و محدودیت‌ها

ویژگی isExpensive — پرچمی حیاتی برای برنامه‌هایی که با حجم زیادی از داده کار می‌کنند. اگر isExpensive = true باشد، برنامه باید کیفیت استریمینگ را کاهش دهد، دانلود به‌روزرسانی‌ها را به تأخیر بیندازد یا به کاربر هشدار دهد. isConstrained نشان‌دهنده فعال بودن حالت Low Data Mode است.

برای بررسی دسترسی به اینترنت (نه فقط شبکه) از متود usesInterfaceType استفاده می‌شود. اگر دستگاه به Wi-Fi بدون اینترنت متصل باشد — NWPath ممکن است satisfied نشان دهد، اما دسترسی واقعی وجود ندارد. در چنین مواردی اعتبارسنجی اضافی از طریق NWConnection مورد نیاز است.

نمونه‌های پیاده‌سازی NWPathMonitor

بیایید پیاده‌سازی پیشرفته NWPathMonitor با مدیریت هزینه‌ها، انواع رابط و اطلاع‌رسانی به ViewModel از طریق publisher را بررسی کنیم. در این مثال از فریم‌ورک Combine برای به‌روزرسانی واکنش‌گرای UI هنگام تغییر وضعیت شبکه استفاده شده است.

swift
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 در مقابل Reachability

پیش از ظهور NWPathMonitor راه‌حل استاندارد برای مانیتورینگ شبکه در iOS کتابخانه Reachability اپل (نمونه از مستندات) بود که بر پایه SystemConfiguration ساخته شده بود. تفاوت‌های اصلی: Reachability از طریق SCNetworkReachability به زبان C کار می‌کند، از انواع مدرن شبکه پشتیبانی نمی‌کند و فقط پاسخ باینری درباره دسترسی می‌دهد.

NWPathMonitor این محدودیت‌ها را حل می‌کند: به زبان Swift نوشته شده، از VPN، multipath، 5G و LTE پشتیبانی می‌کند، اطلاعات دقیقی درباره هر رابط ارائه می‌دهد و به صورت ناهمزمان از طریق GCD کار می‌کند. Reachability همچنان در پروژه‌هایی با پشتیبانی حداقلی از iOS 11 و پایین‌تر استفاده می‌شود.

ویژگیNWPathMonitorReachability
حداقل نسخهiOS 12iOS 2
زبانSwift (Network)C (SystemConfiguration)
انواع رابطWi-Fi, Cellular, Ethernet, VPNWi-Fi, WWAN (عمومی)
isExpensiveداردندارد
ناهمزمانیGCD (dispatch queue)RunLoop
رابط‌های چندگانهدارد (multipath)ندارد

چه زمانی از Reachability استفاده کنیم

اگر برنامه شما از iOS 11 و پایین‌تر پشتیبانی می‌کند، Reachability تنها گزینه باقی می‌ماند. برای پروژه‌های iOS 12+ توصیه می‌شود مستقیماً از NWPathMonitor استفاده کنید — این کلاس با کد مدرن Swift، Combine و SwiftUI بهتر یکپارچه می‌شود.

مهاجرت از Reachability به NWPathMonitor ساده است: کافی است فراخوانی‌های SCNetworkReachability را با NWPathMonitor جایگزین کنید و همان منطق پردازش را حفظ نمایید. لایه انتزاع (پروتکل NetworkMonitorProtocol) امکان جابجایی بین پیاده‌سازی‌ها را بدون تغییر منطق تجاری برنامه فراهم می‌کند.

سوالات متداول

حداقل نسخه iOS مورد نیاز برای NWPathMonitor چقدر است؟

NWPathMonitor از iOS 12.0، macOS 10.14، watchOS 5.0 و tvOS 12.0 در دسترس است. برای پروژه‌هایی که از نسخه‌های قدیمی‌تر پشتیبانی می‌کنند، از Reachability از SystemConfiguration یا کتابخانه‌های wrapper با کامپایل شرطی از طریق #available استفاده کنید.

تفاوت NWPath.Status.satisfied با unsatisfied چیست؟

Satisfied به این معنی است که ترافیک می‌تواند از طریق حداقل یک رابط عبور کند. Unsatisfied — هیچ رابطی در دسترس نیست. وضعیت requiresConnection — مسیر نیاز به برقراری اتصال دارد (مثلاً VPN متصل نیست) و ترافیک موقتاً عبور نمی‌کند.

چگونه نوع شبکه را تعیین کنیم — Wi-Fi یا سلولی؟

از متود usesInterfaceType روی NWPath استفاده کنید: path.usesInterfaceType(.wifi) برای Wi-Fi، path.usesInterfaceType(.cellular) برای داده‌های سلولی. متود true برمی‌گرداند اگر ترافیک فعلی از نوع رابط مشخص شده عبور کند.

آیا NWPathMonitor هنگام رفتن به پس‌زمینه باید لغو شود؟

توصیه می‌شود برای صرفه‌جویی در باتری مانیتورینگ را در پس‌زمینه متوقف کنید. فراخوانی monitor.cancel() در applicationDidEnterBackground و start مجدد در applicationWillEnterForeground مصرف انرژی را کاهش می‌دهد. برای عملیات حیاتی از Background Task استفاده کنید.

چگونه پرتال‌های captive را با NWPathMonitor مدیریت کنیم؟

NWPathMonitor ممکن است حتی در پرتال captive وضعیت satisfied را نشان دهد. برای تعیین دسترسی واقعی به اینترنت، یک درخواست HTTP به endpoint معتمد از طریق NWConnection انجام دهید. اگر ریدایرکت دریافت شد — پرتال فعال است و مجوز در WebView مورد نیاز است.

خلاصه

  • NWPathMonitor — کلاس فریم‌ورک Network برای مانیتورینگ مسیر شبکه در iOS 12+ با پشتیبانی از GCD و Combine.
  • NWPath حاوی اطلاعات کامل درباره اتصال: وضعیت، انواع رابط، هزینه‌ها، محدودیت‌ها و دروازه‌ها.
  • متود start مانیتورینگ را در صف مشخص شده آغاز می‌کند، pathUpdateHandler به‌روزرسانی‌های NWPath را دریافت می‌کند.
  • ویژگی‌های isExpensive و isConstrained امکان تعیین اتصالات تعرفه‌گذاری شده و محدود را فراهم می‌کنند.
  • NWPathMonitor جایگزین Reachability برای iOS 12+ شده و API غنی‌تری به زبان Swift ارائه می‌دهد.
  • فیلتر کردن بر اساس نوع رابط از طریق مقداردهنده اولیه با پارامتر requiredInterfaceType پیاده‌سازی می‌شود.
  • برای کار در پس‌زمینه مانیتورینگ باید هنگام جابجایی بین foreground و background متوقف و از سر گرفته شود.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید