URLSession — API برای درخواستهای شبکه در iOS و macOS است که بخشی از چارچوب Foundation بوده و یک رابط یکپارچه برای کار با HTTP، HTTPS، بارگیری پسزمینه و WebSocket ارائه میدهد. این API جایگزین NSURLConnection منسوخ شده است و به ابزار اصلی شبکه برای توسعهدهندگان Apple تبدیل شده است. بر اساس Apple Developer Documentation (2025)، URLSession بیش از 90٪ ترافیک شبکه را در برنامههای iPhone و iPad پردازش میکند.
نکات اصلی
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 از سه مؤلفه کلیدی تشکیل شده است: پیکربندی جلسه، خود جلسه و وظایف (tasks). هر مؤلفه مسئول جنبه خاصی از تعامل شبکه است و ترکیب آنها رفتار برنامه را هنگام کار با شبکه تعیین میکند.
پیکربندی پارامترهای جلسه را تعیین میکند — از مهلت زمانی گرفته تا سیاستهای ذخیرهسازی موقت. سه نوع وجود دارد: .default (استاندارد با کش دیسکی)، .ephemeral (بدون ذخیره کش و cookie) و .background (برای بارگیری پسزمینه). در پیکربندی میتوان حداکثر تعداد اتصالات به میزبان، مهلت زمانی درخواست و منبع، سیاست TLS و پروکسی را تنظیم کرد.
URLSessionTask — کلاس پایه برای تمام عملیات شبکه. زیرکلاسهای اصلی: URLSessionDataTask برای درخواستهای GET و POST با بازگشت داده در حافظه، URLSessionDownloadTask برای دانلود فایلها روی دیسک، URLSessionUploadTask برای ارسال فایلها به سرور و URLSessionWebSocketTask برای کار با WebSocket از iOS 13.
delegate جلسه رویدادهایی درباره پیشرفت وظایف دریافت میکند: دریافت داده، اتمام بارگیری، خطاهای احراز هویت، تغییر مسیرها. URLSessionDelegate و زیرپروتکلهای آن امکان رهگیری گواهیهای TLS در احراز هویت، مدیریت ذخیرهسازی موقت پاسخها از طریق URLCache و نظارت بر پیشرفت بارگیری فایلهای بزرگ را فراهم میکنند. بهعنوان جایگزین، میتوان از closures (completion handlers) در موارد ساده که نیاز به پردازش رویدادهای میانی ندارند استفاده کرد.
سناریوی پایه کار با URLSession به این صورت است: یک پیکربندی ایجاد میشود، بر اساس آن یک جلسه، سپس از طریق جلسه یک وظیفه با درخواست URL ایجاد میشود و وظیفه شروع میشود. بیایید مثال درخواست GET با closure را بررسی کنیم. این الگو در اکثر برنامههای iOS برای دریافت داده از REST API، بارگیری تصاویر و تعامل با سرویسهای ابری استفاده میشود.
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 از بارگیری فایل با قابلیت توقف و ادامه و همچنین بارگیری پسزمینه پشتیبانی میکند. 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 آن را حذف میکند. برای پیگیری پیشرفت از delegate URLSessionDownloadDelegate با متد didWriteData استفاده میشود که تعداد بایتهای نوشته شده و اندازه کل فایل را ارسال میکند — این دادهها را میتوان برای نمایش نوار پیشرفت در رابط کاربری استفاده کرد. جلسات پسزمینه با downloadTask امکان ادامه بارگیری را حتی پس از کوچک شدن برنامه فراهم میکنند و پس از اتمام، سیستم handler را در AppDelegate فراخوانی میکند.
Alamofire — یک کتابخانه Swift است که بر روی URLSession ساخته شده و رابط اعلانیتری ارائه میدهد. انتخاب بین API بومی و Alamofire به پیچیدگی پروژه و ترجیحات تیم بستگی دارد.
| معیار | URLSession | Alamofire |
|---|---|---|
| وابستگیها | ندارد، در Foundation تعبیه شده | نیازمند SPM یا CocoaPods |
| نحو | امری با closures | اعلانی با زنجیرهها |
| پردازش JSON | JSONSerialization دستی | responseDecodable با Codable |
| رهگیرها | از طریق delegates | RequestInterceptor, EventMonitor |
| پیشرفت | از طریق delegate | 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 در دسترس است. این متد یک tuple (Data, URLResponse) برمیگرداند و در صورت مشکلات شبکه خطا پرتاب میکند. JSONDecoder با مدل Codable به طور خودکار پاسخ را deserialize میکند — این جایگزین 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 منسوخ شده است و استفاده از آن در پروژههای جدید توصیه نمیشود.
برای پیگیری پیشرفت از delegate URLSessionDownloadDelegate با متد urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) استفاده میشود. بهعنوان جایگزین برای dataTask میتوان در URLSessionTaskDelegate مشترک شد و بهروزرسانیها را از طریق didSendBodyData دریافت کرد.
بارگیری پسزمینه از طریق پیکربندی .background(withIdentifier:) تنظیم میشود. برنامه یک handler اتمام در AppDelegate ثبت میکند و نتایج را حتی پس از کوچک شدن یا بسته شدن دریافت میکند. سیستم بارگیری را مدیریت کرده و از طریق delegate sessionDidFinishEvents به برنامه اطلاع میدهد.
بله، از iOS 13 URLSession از WebSocket از طریق کلاس URLSessionWebSocketTask پشتیبانی میکند. این کلاس با متد webSocketTask(with:) ایجاد میشود و متدهای send، receive با پشتیبانی از پیامهای متنی و باینری و همچنین ping/pong برای حفظ اتصال ارائه میدهد.
مهلتهای زمانی از طریق URLSessionConfiguration تنظیم میشوند: ویژگیهای timeoutIntervalForRequest (انتظار برای پاسخ به درخواست) و timeoutIntervalForResource (حداکثر زمان کل بارگیری). به طور پیشفرض: 60 ثانیه برای درخواست و 7 روز برای منبع.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید