URLSession — ما هو، API الشبكة وكيف يعمل في iOS

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

URLSession هي API لطلبات الشبكة في iOS و macOS، وهي جزء من إطار Foundation الذي يوفر واجهة موحدة للعمل مع HTTP و HTTPS والتنزيل في الخلفية و WebSocket. حلت محل NSURLConnection القديمة وأصبحت الأداة الشبكية الرئيسية لمطوري Apple. وفقاً لوثائق Apple Developer (2025)، URLSession تعالج أكثر من 90% من حركة الشبكة في تطبيقات iPhone و iPad.

الخلاصة

  • URLSession — API Apple الأصلي لطلبات الشبكة، HTTP، تنزيل الملفات و WebSocket
  • أنواع المهام: dataTask (الطلبات)، downloadTask (التنزيل)، uploadTask (الرفع)، webSocketTask
  • تكوين الجلسة يحدد السلوك: التخزين المؤقت، المهلات، الوكيل، بيانات الاعتماد
  • عدم التزامن يتم من خلال closures، المفوضين أو async/await الحديث
  • الجلسات الخلفية تسمح بتحميل البيانات حتى عند تصغير التطبيق

ما هو URLSession؟

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

تتكون هندسة URLSession من ثلاثة مكونات رئيسية: تكوين الجلسة، الجلسة نفسها، والمهام. كل مكون مسؤول عن جانب معين من التفاعل الشبكي، ويحدد مزيجها سلوك التطبيق عند العمل مع الشبكة.

URLSessionConfiguration

يحدد التكوين معلمات الجلسة — من المهلات إلى سياسات التخزين المؤقت. هناك ثلاثة أنواع: .default (قياسي مع تخزين مؤقت على القرص)، .ephemeral (بدون حفظ التخزين المؤقت وملفات تعريف الارتباط) و .background (للتنزيل في الخلفية). في التكوين، يمكنك تحديد الحد الأقصى لعدد الاتصالات لكل مضيف، مهلة الطلب والمورد، سياسة TLS وإعدادات الوكيل.

أنواع URLSessionTask

URLSessionTask هي الفئة الأساسية لجميع عمليات الشبكة. الفئات الفرعية الرئيسية: URLSessionDataTask لطلبات GET و POST التي تعيد البيانات في الذاكرة، URLSessionDownloadTask لتنزيل الملفات على القرص، URLSessionUploadTask لرفع الملفات إلى الخادم و URLSessionWebSocketTask للعمل مع WebSocket منذ iOS 13.

مفوضين URLSession

يتلقى مفوض الجلسة أحداثاً حول تقدم المهام: استلام البيانات، اكتمال التنزيل، أخطاء المصادقة، إعادة التوجيه. URLSessionDelegate وبروتوكولاته الفرعية تسمح باعتراض شهادات TLS أثناء المصادقة، إدارة التخزين المؤقت للردود عبر URLCache ومراقبة تقدم تنزيل الملفات الكبيرة. بدلاً من ذلك، يمكن استخدام closures (معالجات الإكمال) للحالات البسيطة التي لا تتطلب معالجة الأحداث الوسيطة.

كيفية تنفيذ الطلبات باستخدام URLSession

سير العمل الأساسي مع URLSession كالتالي: إنشاء تكوين، بناءً عليه إنشاء جلسة، ثم عبر الجلسة إنشاء مهمة مع طلب URL، وتشغيل المهمة. دعنا نستعرض مثال طلب GET مع closure. يستخدم هذا النمط في معظم تطبيقات iOS لجلب البيانات من REST APIs وتحميل الصور والتفاعل مع الخدمات السحابية.

swift
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

يدعم URLSession تنزيل الملفات مع إمكانية الإيقاف والاستئناف، بالإضافة إلى التنزيل في الخلفية. DownloadTask يحفظ الملف في دليل مؤقت، وفي closure الإكمال تحتاج إلى نقله إلى موقع دائم.

swift
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.

URLSession ضد Alamofire

Alamofire هي مكتبة Swift مبنية فوق URLSession توفر واجهة أكثر تصريحاً. يعتمد الاختيار بين API الأصلي و Alamofire على تعقيد المشروع وتفضيلات الفريق.

المعيارURLSessionAlamofire
التبعياتلا شيء، مدمج في Foundationيتطلب SPM أو CocoaPods
الصياغةأمرية مع closuresتصريحية مع تسلسل
معالجة JSONJSONSerialization يدوياًresponseDecodable مع Codable
المعترضاتعبر المفوضينRequestInterceptor, EventMonitor
التقدمعبر المفوضdownloadProgress, uploadProgress

للمشاريع البسيطة، URLSession كافية ولا تضيف تبعيات. Alamofire مبررة في المشاريع التي تحتوي على العديد من طلبات الشبكة ومعالجة معقدة للأخطاء والحاجة إلى صياغة موجزة. كلتا التقنيتين تشتركان في أساس URLSessionConfiguration المشترك ومتوافقتان مع بعضهما البعض. عند الاختيار، ضع في اعتبارك أن URLSession يتم التحكم فيها بالكامل بواسطة Apple ويتم تحديثها مع iOS، بينما تتطلب Alamofire من مطوري المكتبة الحفاظ على التوافق مع إصدارات نظام التشغيل الجديدة.

أمثلة كود URLSession

Swift الحديث يدعم async/await مما يجعل طلبات الشبكة أكثر قابلية للقراءة مقارنة بـ closures. دعنا ننظر إلى نفس طلب GET باستخدام الصياغة غير المتزامنة.

swift
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

لطلبات POST مع جسم JSON، يتم استخدام URLRequest حيث يتم تكوين الطريقة ورؤوس Content-Type وجسم الطلب كـ Data. Async/await يجعل هذه العملية موجزة وواضحة، ومعالجة الأخطاء بسيطة من خلال كتلة do-catch.

swift
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؟

URLSession هو البديل الحديث لـ NSURLConnection، تم تقديمه في iOS 7. تشمل الاختلافات الرئيسية دعم الاتصالات المتعددة عبر الجلسات، إيقاف واستئناف المهام، التنزيل في الخلفية و WebSocket. NSURLConnection مهمل ولا يُنصح باستخدامه في المشاريع الجديدة.

كيف تتتبع تقدم التنزيل في URLSession؟

لتتبع التقدم، استخدم المفوض URLSessionDownloadDelegate مع طريقة urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). بدلاً من ذلك، لـ dataTask يمكنك الاشتراك في URLSessionTaskDelegate وتلقي التحديثات عبر didSendBodyData.

كيف تنفذ تنزيلاً في الخلفية باستخدام URLSession؟

يتم تكوين التنزيل في الخلفية من خلال تكوين .background(withIdentifier:). يسجل التطبيق معالج إكمال في AppDelegate ويتلقى النتائج حتى بعد التصغير أو الإغلاق. يدير النظام التنزيل ويخطر التطبيق من خلال مفوض sessionDidFinishEvents.

هل يمكن استخدام URLSession مع WebSocket؟

نعم، منذ iOS 13، يدعم URLSession WebSocket من خلال فئة URLSessionWebSocketTask. يتم إنشاؤها بطريقة webSocketTask(with:) وتوفر طرق send و receive مع دعم الرسائل النصية والثنائية، بالإضافة إلى ping/pong للحفاظ على الاتصال نشطاً.

كيف تهيئ المهلات في URLSession؟

يتم تكوين المهلات من خلال URLSessionConfiguration: الخاصية timeoutIntervalForRequest (انتظار الرد على الطلب) و timeoutIntervalForResource (الوقت الأقصى للتنزيل بأكمله). الافتراضي: 60 ثانية للطلب و 7 أيام للمورد.

الملخص

  • URLSession — API Apple الأصلي لطلبات الشبكة، يدعم HTTP والتنزيل في الخلفية و WebSocket
  • ثلاثة أنواع من التكوين (.default, .ephemeral, .background) تحدد سلوك الجلسة
  • أربعة أنواع من المهام تغطي جميع السيناريوهات: dataTask, downloadTask, uploadTask, webSocketTask
  • المفوضون يسمحون بإدارة المصادقة والتقدم وإعادة التوجيه
  • Async/await منذ iOS 15 يجعل كود URLSession أكثر قابلية للقراءة وإيجازاً
  • اختيار URLSession أو Alamofire يعتمد على حجم المشروع — URLSession كافية للمهام البسيطة

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

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

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

اقرأ أيضًا