URLSession — це API для мережевих запитів у iOS і macOS, що входить до Foundation framework і надає єдиний інтерфейс для роботи з HTTP, HTTPS, фоновим завантаженням і WebSocket. Він замінив застарілий NSURLConnection і став основним мережевим інструментом для розробників Apple. За даними Apple Developer Documentation (2025), URLSession обробляє понад 90% мережевого трафіку в додатках для iPhone та iPad.
Головне
URLSession — це API для мережевих операцій, представлений Apple в iOS 7 та macOS 10.9. Він замінив NSURLConnection і надав більш гнучку та потужну модель для роботи з мережею. Бібліотека підтримує HTTP/1.1, HTTP/2, HTTP/3 та WebSocket, а також фонові сесії для завантаження даних.
Основна перевага URLSession перед старим NSURLConnection — підтримка багатьох одночасних з'єднань через єдину сесію, настроювані конфігурації та можливість призупиняти та відновлювати завантаження. Сесія об'єднує групу мережевих завдань зі спільними налаштуваннями: кешування, політика cookie, тайм-аути, сертифікати TLS.
В iOS URLSession працює з системним DNS-кешем, керуванням живленням та фоновими процесами. При згорнутому додатку система може продовжувати завантаження даних через фонову сесію, а після завершення — сповістити додаток через обробник завершення. Фонові сесії особливо корисні для завантаження великих файлів, оновлення вмісту та синхронізації даних у додатках для роботи з документами та медіафайлами. Для роботи з фоновими сесіями необхідно реалізувати делегат 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.
Делегат сесії отримує події про хід виконання завдань: отримання даних, завершення завантаження, помилки аутентифікації, редиректи. URLSessionDelegate та його підпротоколи дозволяють перехоплювати сертифікати TLS при аутентифікації, керувати кешуванням відповідей через URLCache та моніторити прогрес завантаження великих файлів. Альтернативно можна використовувати замикання (completion handlers) для простих випадків, коли не потрібна обробка проміжних подій.
Базовий сценарій роботи з URLSession виглядає так: створюється конфігурація, на її основі — сесія, потім через сесію створюється завдання з URL-запитом, і завдання запускається. Розберемо приклад GET-запиту із замиканням. Цей патерн використовується в більшості 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 — синглтон з конфігурацією .default для простих запитів. dataTask створює асинхронну операцію, але не запускає її — обов'язково викликати resume(). Замикання спрацьовує після завершення запиту та повертає data, response або error. Для кастомної сесії з власною конфігурацією використовуйте ініціалізатор URLSession(configuration:), який дозволяє задати політики кешування, тайм-аути, максимальну кількість з'єднань, HTTP-заголовки за замовчуванням та налаштування проксі для всіх завдань сесії. Такий підхід дає повний контроль над поведінкою мережі в додатку.
URLSession підтримує завантаження файлів з можливістю призупинення та відновлення, а також фонове завантаження. DownloadTask зберігає файл у тимчасову директорію, а в замиканні completion потрібно перемістити його в постійне місце.
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 у замиканні вказує на тимчасовий файл, який потрібно перемістити, інакше система видалить його після виходу із замикання. Для відстеження прогресу використовується делегат URLSessionDownloadDelegate з методом didWriteData, який передає кількість записаних байт та загальний розмір файлу — ці дані можна використовувати для відображення прогрес-бару в інтерфейсі користувача. Фонові сесії з downloadTask дозволяють продовжувати завантаження навіть після згортання додатка, а при завершенні система викликає обробник в AppDelegate.
Alamofire — це Swift-бібліотека, побудована поверх URLSession, яка надає більш декларативний інтерфейс. Вибір між нативним API та Alamofire залежить від складності проекту та вподобань команди.
| Критерій | URLSession | Alamofire |
|---|---|---|
| Залежності | Немає, вбудовано в Foundation | Вимагає SPM або CocoaPods |
| Синтаксис | Імперативний із замиканнями | Декларативний з ланцюжками |
| Обробка JSON | JSONSerialization вручну | responseDecodable з Codable |
| Перехоплювачі | Через делегати | RequestInterceptor, EventMonitor |
| Прогрес | Через делегат | downloadProgress, uploadProgress |
Для простих проектів URLSession достатній і не додає залежностей. Alamofire виправданий у проектах з безліччю мережевих запитів, складною обробкою помилок та вимогою лаконічного синтаксису. Обидві технології використовують спільний фундамент URLSessionConfiguration і сумісні одна з одною. При виборі варто враховувати, що URLSession повністю контролюється Apple і оновлюється разом з iOS, в той час як Alamofire вимагає підтримки сумісності з новими версіями ОС з боку розробників бібліотеки.
Сучасний Swift підтримує async/await, який робить мережеві запити більш читабельними порівняно із замиканнями. Розглянемо той же 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також