NWPathMonitor هو فئة من إطار العمل Network في iOS و macOS لمراقبة حالة مسار الشبكة للجهاز. وفقًا لـ Apple Developer Documentation (2025)، يسمح NWPathMonitor للتطبيق بتتبع توفر الشبكة، تحديد نوع الواجهة، والاستجابة لتغييرات الاتصال. NWPathMonitor يوفر معلومات عن نوع الاتصال، تكاليف البيانات، وتوفر الإنترنت من خلال استدعاء مرتاح مع NWPath.
النقاط الرئيسية
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 كبديل حديث لواجهات البرمجة المنخفضة المستوى بـ C — CFStream و BSD Sockets. يوفر واجهة موحدة للاتصال الشبكي على جميع منصات Apple، بما في ذلك watchOS و tvOS. NWPathMonitor هو جزء من هذا الإطار إلى جانب NWConnection، NWListener و NWBrowser.
إطار العمل Network مكتوب بـ Swift ويستخدم GCD للمعالجة غير المتزامنة. وهذا يعني أن استدعاءات NWPathMonitor تتنفذ على طابور dispatch queue المحدد، متكاملة مع هندسة التعدد الموجودة للتطبيق دون إدارة يدوية للخيوط.
يبدأ استخدام NWPathMonitor بإنشاء مثال من الفئة وتكوين استدعاء pathUpdateHandler. ثم يتم استدعاء طريقة start مع طابور dispatch queue حيث سيتم تنفيذ الغلاق. يتم إيقاف المراقبة بطريقة 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 يشير إلى أن وضع البيانات المنخفض مفعّل.
للتحقق من توفر الإنترنت (ليس فقط الشبكة)، استخدم طريقة usesInterfaceType. إذا كان الجهاز متصلًا بـ Wi-Fi دون إنترنت — قد يظهر NWPath بحالة satisfied، ولكن الوصول الفعلي غير موجود. في هذه الحالات، يلزم التحقق الإضافي عبر NWConnection.
دعنا ننظر إلى تنفيذ متقدم لـ NWPathMonitor مع معالجة التكاليف، أنواع الواجهات، وإشعار ViewModel من خلال ناشر. يستخدم المثال إطار Combine للتحديثات التفاعلية لواجهة المستخدم عند تغير حالة الشبكة.
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، كان الحل القياسي لمراقبة الشبكة في iOS هو مكتبة Reachability من Apple (مثال من التوثيق)، المبنية على 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 أو مكتبات غلاف مع تجميع شرطي عبر #available.
Satisfied يعني أن حركة المرور يمكنها المرور عبر واجهة واحدة على الأقل. Unsatisfied — لا تتوفر أي واجهة. حالة requiresConnection — المسار يتطلب إنشاء اتصال (على سبيل المثال، VPN غير متصل)، وحركة المرور لا تمر مؤقتًا.
استخدم طريقة usesInterfaceType على NWPath: path.usesInterfaceType(.wifi) لـ Wi-Fi، path.usesInterfaceType(.cellular) للبيانات الخلوية. تعود الطريقة true إذا كانت حركة المرور الحالية تمر عبر نوع الواجهة المحدد.
يوصى بإيقاف المراقبة في الخلفية لتوفير البطارية. استدعاء monitor.cancel() في applicationDidEnterBackground وإعادة start في applicationWillEnterForeground يقللان استهلاك الطاقة. استخدم Background Task للعمليات الحرجة.
قد يظهر NWPathMonitor حالة satisfied حتى مع البوابة التقيدية. لتحديد الوصول الفعلي إلى الإنترنت، قم بتنفيذ طلب HTTP إلى نقطة نهاية موثوقة عبر NWConnection. إذا حدث إعادة توجيه — فالبوابة نشطة وتتطلب ترخيصًا في WebView.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.