URLSession — چیست، API شبکه و چگونه در iOS کار می‌کند

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

URLSession — API برای درخواست‌های شبکه در iOS و macOS است که بخشی از چارچوب Foundation بوده و یک رابط یکپارچه برای کار با HTTP، HTTPS، بارگیری پس‌زمینه و WebSocket ارائه می‌دهد. این API جایگزین NSURLConnection منسوخ شده است و به ابزار اصلی شبکه برای توسعه‌دهندگان Apple تبدیل شده است. بر اساس Apple Developer Documentation (2025)، URLSession بیش از 90٪ ترافیک شبکه را در برنامه‌های iPhone و iPad پردازش می‌کند.

نکات اصلی

  • URLSession — API بومی Apple برای درخواست‌های شبکه، HTTP، بارگیری فایل و WebSocket
  • انواع وظایف: dataTask (درخواست‌ها)، downloadTask (دانلود)، uploadTask (آپلود)، webSocketTask
  • پیکربندی جلسه رفتار را تعیین می‌کند: ذخیره‌سازی موقت، مهلت زمانی، پروکسی، اعتبارنامه
  • ناهمزمانی از طریق closures، delegates یا async/await مدرن پیاده‌سازی می‌شود
  • جلسات پس‌زمینه امکان بارگیری داده‌ها را حتی زمانی که برنامه کوچک شده است فراهم می‌کنند

URLSession چیست؟

URLSession — API برای عملیات شبکه است که توسط Apple در iOS 7 و macOS 10.9 معرفی شد. این API جایگزین NSURLConnection شد و مدل منعطف‌تر و قدرتمندتری برای کار با شبکه ارائه داد. این کتابخانه از HTTP/1.1، HTTP/2، HTTP/3 و WebSocket و همچنین جلسات پس‌زمینه برای بارگیری داده پشتیبانی می‌کند.

مزیت اصلی URLSession نسبت به NSURLConnection قدیمی — پشتیبانی از اتصالات همزمان متعدد از طریق یک جلسه واحد، پیکربندی‌های قابل تنظیم و امکان توقف و ادامه بارگیری‌ها است. جلسه گروهی از وظایف شبکه را با تنظیمات مشترک ترکیب می‌کند: ذخیره‌سازی موقت، سیاست cookie، مهلت زمانی، گواهی‌های TLS.

در iOS، URLSession با کش DNS سیستم، مدیریت انرژی و فرآیندهای پس‌زمینه کار می‌کند. هنگامی که برنامه کوچک می‌شود، سیستم می‌تواند بارگیری داده را از طریق جلسه پس‌زمینه ادامه دهد و پس از اتمام، برنامه را از طریق handler اتمام مطلع کند. جلسات پس‌زمینه به ویژه برای بارگیری فایل‌های بزرگ، به‌روزرسانی محتوا و همگام‌سازی داده در برنامه‌های کار با اسناد و فایل‌های چندرسانه‌ای مفید هستند. برای کار با جلسات پس‌زمینه باید delegate URLSessionDelegate را پیاده‌سازی کرد و شناسه پیکربندی را هنگام ایجاد جلسه ارسال کرد — سیستم از این شناسه برای بازیابی جلسه پس از راه‌اندازی مجدد برنامه استفاده می‌کند.

مزیت مهم URLSession پشتیبانی از HTTP/2 و HTTP/3 است. مالتی‌پلکسینگ HTTP/2 امکان ارسال چندین درخواست را از طریق یک اتصال TCP فراهم می‌کند که تأخیر و بار سرور را کاهش می‌دهد. HTTP/3 مبتنی بر پروتکل QUIC بر روی UDP، اتصال سریع‌تری را با حذف دست‌دهی TCP فراهم می‌کند.

معماری URLSession

معماری URLSession از سه مؤلفه کلیدی تشکیل شده است: پیکربندی جلسه، خود جلسه و وظایف (tasks). هر مؤلفه مسئول جنبه خاصی از تعامل شبکه است و ترکیب آنها رفتار برنامه را هنگام کار با شبکه تعیین می‌کند.

URLSessionConfiguration

پیکربندی پارامترهای جلسه را تعیین می‌کند — از مهلت زمانی گرفته تا سیاست‌های ذخیره‌سازی موقت. سه نوع وجود دارد: .default (استاندارد با کش دیسکی)، .ephemeral (بدون ذخیره کش و cookie) و .background (برای بارگیری پس‌زمینه). در پیکربندی می‌توان حداکثر تعداد اتصالات به میزبان، مهلت زمانی درخواست و منبع، سیاست TLS و پروکسی را تنظیم کرد.

انواع وظایف URLSessionTask

URLSessionTask — کلاس پایه برای تمام عملیات شبکه. زیرکلاس‌های اصلی: URLSessionDataTask برای درخواست‌های GET و POST با بازگشت داده در حافظه، URLSessionDownloadTask برای دانلود فایل‌ها روی دیسک، URLSessionUploadTask برای ارسال فایل‌ها به سرور و URLSessionWebSocketTask برای کار با WebSocket از iOS 13.

Delegatesهای URLSession

delegate جلسه رویدادهایی درباره پیشرفت وظایف دریافت می‌کند: دریافت داده، اتمام بارگیری، خطاهای احراز هویت، تغییر مسیرها. URLSessionDelegate و زیرپروتکل‌های آن امکان رهگیری گواهی‌های TLS در احراز هویت، مدیریت ذخیره‌سازی موقت پاسخ‌ها از طریق URLCache و نظارت بر پیشرفت بارگیری فایل‌های بزرگ را فراهم می‌کنند. به‌عنوان جایگزین، می‌توان از closures (completion handlers) در موارد ساده که نیاز به پردازش رویدادهای میانی ندارند استفاده کرد.

نحوه انجام درخواست‌ها با URLSession

سناریوی پایه کار با URLSession به این صورت است: یک پیکربندی ایجاد می‌شود، بر اساس آن یک جلسه، سپس از طریق جلسه یک وظیفه با درخواست URL ایجاد می‌شود و وظیفه شروع می‌شود. بیایید مثال درخواست GET با closure را بررسی کنیم. این الگو در اکثر برنامه‌های iOS برای دریافت داده از REST API، بارگیری تصاویر و تعامل با سرویس‌های ابری استفاده می‌شود.

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!.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 آن را حذف می‌کند. برای پیگیری پیشرفت از delegate URLSessionDownloadDelegate با متد didWriteData استفاده می‌شود که تعداد بایت‌های نوشته شده و اندازه کل فایل را ارسال می‌کند — این داده‌ها را می‌توان برای نمایش نوار پیشرفت در رابط کاربری استفاده کرد. جلسات پس‌زمینه با downloadTask امکان ادامه بارگیری را حتی پس از کوچک شدن برنامه فراهم می‌کنند و پس از اتمام، سیستم handler را در AppDelegate فراخوانی می‌کند.

URLSession در مقابل Alamofire

Alamofire — یک کتابخانه Swift است که بر روی URLSession ساخته شده و رابط اعلانی‌تری ارائه می‌دهد. انتخاب بین API بومی و Alamofire به پیچیدگی پروژه و ترجیحات تیم بستگی دارد.

معیارURLSessionAlamofire
وابستگی‌هاندارد، در Foundation تعبیه شدهنیازمند SPM یا CocoaPods
نحوامری با closuresاعلانی با زنجیره‌ها
پردازش JSONJSONSerialization دستیresponseDecodable با Codable
رهگیرهااز طریق delegatesRequestInterceptor, EventMonitor
پیشرفتاز طریق delegatedownloadProgress, 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 در دسترس است. این متد یک tuple (Data, URLResponse) برمی‌گرداند و در صورت مشکلات شبکه خطا پرتاب می‌کند. JSONDecoder با مدل Codable به طور خودکار پاسخ را deserialize می‌کند — این جایگزین 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 پیگیری کنیم؟

برای پیگیری پیشرفت از delegate URLSessionDownloadDelegate با متد urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) استفاده می‌شود. به‌عنوان جایگزین برای dataTask می‌توان در URLSessionTaskDelegate مشترک شد و به‌روزرسانی‌ها را از طریق didSendBodyData دریافت کرد.

چگونه بارگیری پس‌زمینه را با URLSession انجام دهیم؟

بارگیری پس‌زمینه از طریق پیکربندی .background(withIdentifier:) تنظیم می‌شود. برنامه یک handler اتمام در AppDelegate ثبت می‌کند و نتایج را حتی پس از کوچک شدن یا بسته شدن دریافت می‌کند. سیستم بارگیری را مدیریت کرده و از طریق delegate 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
  • Delegates امکان مدیریت احراز هویت، پیشرفت و تغییر مسیرها را فراهم می‌کنند
  • Async/await از iOS 15 کد URLSession را خواناتر و مختصرتر می‌کند
  • انتخاب URLSession یا Alamofire به مقیاس پروژه بستگی دارد — URLSession برای وظایف ساده کافی است

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

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

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

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