NWPathMonitor: ما هو، تتبع الشبكة والعمل في iOS

المؤلف: IT Sectr نُشر: 2026-03-10 وقت القراءة: 9 دق

NWPathMonitor هو فئة من إطار العمل Network في iOS و macOS لمراقبة حالة مسار الشبكة للجهاز. وفقًا لـ Apple Developer Documentation (2025)، يسمح NWPathMonitor للتطبيق بتتبع توفر الشبكة، تحديد نوع الواجهة، والاستجابة لتغييرات الاتصال. NWPathMonitor يوفر معلومات عن نوع الاتصال، تكاليف البيانات، وتوفر الإنترنت من خلال استدعاء مرتاح مع NWPath.

النقاط الرئيسية

  • NWPathMonitor — فئة من إطار العمل Network للمراقبة غير المتزامنة لمسار الشبكة في iOS و macOS.
  • NWPath يحتوي على معلومات حول توفر الشبكة، نوع الواجهة (Wi-Fi، البيانات الخلوية، Ethernet) وحالة التكاليف.
  • طريقة start تبدأ المراقبة على طابور dispatch queue المحدد، وطريقة cancel توقفها.
  • الخاصية pathUpdateHandler — غلاق يتم استدعاؤه عند كل تغيير في حالة مسار الشبكة.
  • NWPathMonitor يدعم التصفية حسب نوع الواجهة المطلوب من خلال المعلمة requiredInterfaceType.

ما هو NWPathMonitor؟

NWPathMonitor هو فئة من إطار العمل Network التي قدمتها Apple في iOS 12 و macOS 10.14 Mojave. يوفر API حديثة لتتبع التغييرات في مسار الشبكة للجهاز — مجموعة واجهات الشبكة التي يمر عبرها حركة مرور التطبيق.

قبل iOS 12، كانت مكتبة Reachability المبنية على إطار العمل SystemConfiguration بـ C تستخدم لمراقبة الشبكة. NWPathMonitor هو بديل أصلي بـ Swift مع API أكثر ثراءً، ودعم لـ أنواع الاتصال الحديثة (VPN، multipath، LTE، 5G) وتكامل مدمج مع GCD.

الفرق الرئيسي بين NWPathMonitor و Reachability — كائن NWPath يوفر ليس مجرد حالة ثنائية «متاح/غير متاح»، ولكن صورة كاملة للمسار: الواجهات المستخدمة، أولويتها، التكاليف، حالة التجول، وقدرات البروكسي و VPN. يحصل المطور على معلومات شاملة لاتخاذ القرارات حول طلبات الشبكة.

تاريخ إطار العمل Network

ظهر إطار العمل Network كبديل حديث لواجهات البرمجة المنخفضة المستوى بـ C — CFStream و BSD Sockets. يوفر واجهة موحدة للاتصال الشبكي على جميع منصات Apple، بما في ذلك watchOS و tvOS. NWPathMonitor هو جزء من هذا الإطار إلى جانب NWConnection، NWListener و NWBrowser.

إطار العمل Network مكتوب بـ Swift ويستخدم GCD للمعالجة غير المتزامنة. وهذا يعني أن استدعاءات NWPathMonitor تتنفذ على طابور dispatch queue المحدد، متكاملة مع هندسة التعدد الموجودة للتطبيق دون إدارة يدوية للخيوط.

كيفية استخدام NWPathMonitor في التطبيق

يبدأ استخدام NWPathMonitor بإنشاء مثال من الفئة وتكوين استدعاء pathUpdateHandler. ثم يتم استدعاء طريقة start مع طابور dispatch queue حيث سيتم تنفيذ الغلاق. يتم إيقاف المراقبة بطريقة 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 يشير إلى أن وضع البيانات المنخفض مفعّل.

للتحقق من توفر الإنترنت (ليس فقط الشبكة)، استخدم طريقة usesInterfaceType. إذا كان الجهاز متصلًا بـ Wi-Fi دون إنترنت — قد يظهر NWPath بحالة satisfied، ولكن الوصول الفعلي غير موجود. في هذه الحالات، يلزم التحقق الإضافي عبر NWConnection.

أمثلة تنفيذ NWPathMonitor

دعنا ننظر إلى تنفيذ متقدم لـ NWPathMonitor مع معالجة التكاليف، أنواع الواجهات، وإشعار ViewModel من خلال ناشر. يستخدم المثال إطار Combine للتحديثات التفاعلية لواجهة المستخدم عند تغير حالة الشبكة.

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
    }
}

معالجة فقدان الشبكة بإجراء مؤجل

عند فقدان الاتصال، قد تحتاج ليس فقط إلى إشعار واجهة المستخدم ولكن أيضًا لتنفيذ إجراءات مؤجلة — على سبيل المثال، حفظ مسودة طلب لإرسالها لاحقًا. قم بتنفيذ طابور الطلبات المؤجلة الذي يجمع العمليات أثناء حالة unsatisfied ويرسلها عند استعادة satisfied.

نمط ReachabilityManager مع مفوض مثالي لهذه المهمة: NWPathMonitor يخطر المدير، والمدير يحدث الطابور وواجهة المستخدم. عندما يتحول الحالة إلى satisfied، يتم تفريغ الطابور تلقائيًا، وتتلقى واجهة المستخدم إشارة استعادة الاتصال.

NWPathMonitor مقارنة بـ Reachability

قبل NWPathMonitor، كان الحل القياسي لمراقبة الشبكة في iOS هو مكتبة Reachability من Apple (مثال من التوثيق)، المبنية على 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 أو مكتبات غلاف مع تجميع شرطي عبر #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 للعمليات الحرجة.

كيف معالجة البوابات التقيدية مع NWPathMonitor؟

قد يظهر NWPathMonitor حالة satisfied حتى مع البوابة التقيدية. لتحديد الوصول الفعلي إلى الإنترنت، قم بتنفيذ طلب HTTP إلى نقطة نهاية موثوقة عبر NWConnection. إذا حدث إعادة توجيه — فالبوابة نشطة وتتطلب ترخيصًا في WebView.

الملخص

  • NWPathMonitor — فئة من إطار العمل Network لمراقبة مسار الشبكة في iOS 12+ مع دعم GCD و Combine.
  • NWPath يحتوي على معلومات كاملة عن الاتصال: الحالة، أنواع الواجهات، التكاليف، القيود والبوابات.
  • طريقة start تبدأ المراقبة على الطابور المحدد، pathUpdateHandler يتلقى تحديثات NWPath.
  • الخاصيتان isExpensive و isConstrained تسمحان بتحديد الاتصالات محدودة التكلفة والمقيدة.
  • NWPathMonitor حل محل Reachability لـ iOS 12+، موفرًا API أكثر ثراءً بـ Swift.
  • تصفية حسب نوع الواجهة تتم عبر المهيئ مع المعلمة requiredInterfaceType.
  • للعمل في الخلفية، يجب إيقاف المراقبة واستئنافها عند التبديل بين المقدمة والخلفية.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا