URLSession هي API لطلبات الشبكة في iOS و macOS، وهي جزء من إطار Foundation الذي يوفر واجهة موحدة للعمل مع HTTP و HTTPS والتنزيل في الخلفية و WebSocket. حلت محل NSURLConnection القديمة وأصبحت الأداة الشبكية الرئيسية لمطوري Apple. وفقاً لوثائق Apple Developer (2025)، URLSession تعالج أكثر من 90% من حركة الشبكة في تطبيقات iPhone و iPad.
الخلاصة
URLSession هي API لعمليات الشبكة قدمتها Apple في iOS 7 و macOS 10.9. حلت محل NSURLConnection وقدمت نموذجاً أكثر مرونة وقوة للعمل مع الشبكة. تدعم المكتبة HTTP/1.1 و HTTP/2 و HTTP/3 و WebSocket، بالإضافة إلى الجلسات الخلفية لتحميل البيانات.
الميزة الرئيسية لـ URLSession مقارنة بـ NSURLConnection القديمة هي دعم الاتصالات المتزامنة المتعددة عبر جلسة واحدة، والتكوينات القابلة للتخصيص، وإمكانية إيقاف واستئناف التنزيلات. الجلسة تجمع مجموعة من مهام الشبكة بإعدادات مشتركة: التخزين المؤقت، سياسة ملفات تعريف الارتباط، المهلات، شهادات TLS.
في iOS، تعمل URLSession مع ذاكرة التخزين المؤقت DNS للنظام، وإدارة الطاقة، والعمليات الخلفية. عند تصغير التطبيق، يمكن للنظام الاستمرار في تحميل البيانات عبر جلسة خلفية، وعند الانتهاء، إخطار التطبيق من خلال معالج الإكمال. الجلسات الخلفية مفيدة بشكل خاص لتنزيل الملفات الكبيرة، تحديث المحتوى ومزامنة البيانات في تطبيقات المستندات والوسائط. للعمل مع الجلسات الخلفية، تحتاج إلى تنفيذ URLSessionDelegate وتمرير معرف التكوين عند إنشاء الجلسة — يستخدم النظام هذا المعرف لاستعادة الجلسة بعد إعادة تشغيل التطبيق.
ميزة مهمة لـ URLSession هي دعم HTTP/2 و HTTP/3. تعدد الإرسال HTTP/2 يسمح بإرسال طلبات متعددة عبر اتصال TCP واحد، مما يقلل زمن الانتقال وحمل الخادم. HTTP/3، المبني على بروتوكول QUIC عبر UDP، يوفر إنشاء اتصال أسرع من خلال إلغاء المصافحة TCP.
تتكون هندسة URLSession من ثلاثة مكونات رئيسية: تكوين الجلسة، الجلسة نفسها، والمهام. كل مكون مسؤول عن جانب معين من التفاعل الشبكي، ويحدد مزيجها سلوك التطبيق عند العمل مع الشبكة.
يحدد التكوين معلمات الجلسة — من المهلات إلى سياسات التخزين المؤقت. هناك ثلاثة أنواع: .default (قياسي مع تخزين مؤقت على القرص)، .ephemeral (بدون حفظ التخزين المؤقت وملفات تعريف الارتباط) و .background (للتنزيل في الخلفية). في التكوين، يمكنك تحديد الحد الأقصى لعدد الاتصالات لكل مضيف، مهلة الطلب والمورد، سياسة TLS وإعدادات الوكيل.
URLSessionTask هي الفئة الأساسية لجميع عمليات الشبكة. الفئات الفرعية الرئيسية: URLSessionDataTask لطلبات GET و POST التي تعيد البيانات في الذاكرة، URLSessionDownloadTask لتنزيل الملفات على القرص، URLSessionUploadTask لرفع الملفات إلى الخادم و URLSessionWebSocketTask للعمل مع WebSocket منذ iOS 13.
يتلقى مفوض الجلسة أحداثاً حول تقدم المهام: استلام البيانات، اكتمال التنزيل، أخطاء المصادقة، إعادة التوجيه. URLSessionDelegate وبروتوكولاته الفرعية تسمح باعتراض شهادات TLS أثناء المصادقة، إدارة التخزين المؤقت للردود عبر URLCache ومراقبة تقدم تنزيل الملفات الكبيرة. بدلاً من ذلك، يمكن استخدام closures (معالجات الإكمال) للحالات البسيطة التي لا تتطلب معالجة الأحداث الوسيطة.
سير العمل الأساسي مع URLSession كالتالي: إنشاء تكوين، بناءً عليه إنشاء جلسة، ثم عبر الجلسة إنشاء مهمة مع طلب URL، وتشغيل المهمة. دعنا نستعرض مثال طلب GET مع closure. يستخدم هذا النمط في معظم تطبيقات iOS لجلب البيانات من REST APIs وتحميل الصور والتفاعل مع الخدمات السحابية.
let url = URL(string: "https://api.example.com/users")!
let session = URLSession.shared
let task = session.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print("Error: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
المثال يستخدم URLSession.shared — singleton مع تكوين .default للطلبات البسيطة. dataTask تنشئ عملية غير متزامنة ولكنها لا تبدأها — يجب استدعاء resume(). يتم تنفيذ closure بعد اكتمال الطلب ويعيد data أو response أو error. لجلسة مخصصة مع تكوين خاص بك، استخدم المُنشئ URLSession(configuration:) الذي يسمح بتعيين سياسات التخزين المؤقت والمهلات والحد الأقصى للاتصالات ورؤوس HTTP الافتراضية وإعدادات الوكيل لجميع مهام الجلسة. هذا النهج يمنحك تحكماً كاملاً في سلوك الشبكة في تطبيقك.
يدعم URLSession تنزيل الملفات مع إمكانية الإيقاف والاستئناف، بالإضافة إلى التنزيل في الخلفية. DownloadTask يحفظ الملف في دليل مؤقت، وفي closure الإكمال تحتاج إلى نقله إلى موقع دائم.
let url = URL(string: "https://example.com/file.zip")!
let session = URLSession(configuration: .default)
let task = session.downloadTask(with: url) { location, _, _ in
guard let location = location else { return }
let destination = FileManager.default.temporaryDirectory
.appendingPathComponent("file.zip")
try? FileManager.default.moveItem(at: location, to: destination)
}
task.resume()
المعامل location في closure يشير إلى ملف مؤقت يجب نقله، وإلا سيقوم النظام بحذفه بعد الخروج من closure. لتتبع التقدم، استخدم المفوض URLSessionDownloadDelegate مع طريقة didWriteData التي تمرر عدد البايتات المكتوبة والحجم الإجمالي للملف — يمكن استخدام هذه البيانات لعرض شريط التقدم في واجهة المستخدم. الجلسات الخلفية مع downloadTask تسمح بمواصلة التنزيل حتى بعد تصغير التطبيق، وعند الاكتمال، يستدعي النظام المعالج في AppDelegate.
Alamofire هي مكتبة Swift مبنية فوق URLSession توفر واجهة أكثر تصريحاً. يعتمد الاختيار بين API الأصلي و Alamofire على تعقيد المشروع وتفضيلات الفريق.
| المعيار | URLSession | Alamofire |
|---|---|---|
| التبعيات | لا شيء، مدمج في Foundation | يتطلب SPM أو CocoaPods |
| الصياغة | أمرية مع closures | تصريحية مع تسلسل |
| معالجة JSON | JSONSerialization يدوياً | responseDecodable مع Codable |
| المعترضات | عبر المفوضين | RequestInterceptor, EventMonitor |
| التقدم | عبر المفوض | downloadProgress, uploadProgress |
للمشاريع البسيطة، URLSession كافية ولا تضيف تبعيات. Alamofire مبررة في المشاريع التي تحتوي على العديد من طلبات الشبكة ومعالجة معقدة للأخطاء والحاجة إلى صياغة موجزة. كلتا التقنيتين تشتركان في أساس URLSessionConfiguration المشترك ومتوافقتان مع بعضهما البعض. عند الاختيار، ضع في اعتبارك أن URLSession يتم التحكم فيها بالكامل بواسطة Apple ويتم تحديثها مع iOS، بينما تتطلب Alamofire من مطوري المكتبة الحفاظ على التوافق مع إصدارات نظام التشغيل الجديدة.
Swift الحديث يدعم async/await مما يجعل طلبات الشبكة أكثر قابلية للقراءة مقارنة بـ closures. دعنا ننظر إلى نفس طلب GET باستخدام الصياغة غير المتزامنة.
func fetchUsers() async throws -> [User] {
let url = URL(string: "https://api.example.com/users")!
let (data, _) = try await URLSession.shared.data(from: url)
let users = try JSONDecoder().decode([User].self, from: data)
return users
}
طريقة data(from:) متاحة منذ iOS 15 و macOS 12. تعيد زوجاً (Data, URLResponse) وترمي خطأ عند مشاكل الشبكة. JSONDecoder مع نموذج Codable يقوم تلقائياً بإلغاء تسلسل الاستجابة — وهذا يستبدل JSONSerialization المرهق من المثال السابق.
لطلبات POST مع جسم JSON، يتم استخدام URLRequest حيث يتم تكوين الطريقة ورؤوس Content-Type وجسم الطلب كـ Data. Async/await يجعل هذه العملية موجزة وواضحة، ومعالجة الأخطاء بسيطة من خلال كتلة do-catch.
func createUser(name: String) async throws -> User {
var request = URLRequest(url: URL(string: "https://api.example.com/users")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = try JSONEncoder().encode(["name": name])
request.httpBody = body
let (data, _) = try await URLSession.shared.data(for: request)
return try JSONDecoder().decode(User.self, from: data)
}
الأسئلة الشائعة
URLSession هو البديل الحديث لـ NSURLConnection، تم تقديمه في iOS 7. تشمل الاختلافات الرئيسية دعم الاتصالات المتعددة عبر الجلسات، إيقاف واستئناف المهام، التنزيل في الخلفية و WebSocket. NSURLConnection مهمل ولا يُنصح باستخدامه في المشاريع الجديدة.
لتتبع التقدم، استخدم المفوض URLSessionDownloadDelegate مع طريقة urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). بدلاً من ذلك، لـ dataTask يمكنك الاشتراك في URLSessionTaskDelegate وتلقي التحديثات عبر didSendBodyData.
يتم تكوين التنزيل في الخلفية من خلال تكوين .background(withIdentifier:). يسجل التطبيق معالج إكمال في AppDelegate ويتلقى النتائج حتى بعد التصغير أو الإغلاق. يدير النظام التنزيل ويخطر التطبيق من خلال مفوض sessionDidFinishEvents.
نعم، منذ iOS 13، يدعم URLSession WebSocket من خلال فئة URLSessionWebSocketTask. يتم إنشاؤها بطريقة webSocketTask(with:) وتوفر طرق send و receive مع دعم الرسائل النصية والثنائية، بالإضافة إلى ping/pong للحفاظ على الاتصال نشطاً.
يتم تكوين المهلات من خلال URLSessionConfiguration: الخاصية timeoutIntervalForRequest (انتظار الرد على الطلب) و timeoutIntervalForResource (الوقت الأقصى للتنزيل بأكمله). الافتراضي: 60 ثانية للطلب و 7 أيام للمورد.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا