URLSession — що це, мережевий API і як працює в iOS

Автор: IT Sectr Опубліковано: 2026-03-07 Час читання: 8 хв

URLSession — це API для мережевих запитів у iOS і macOS, що входить до Foundation framework і надає єдиний інтерфейс для роботи з HTTP, HTTPS, фоновим завантаженням і WebSocket. Він замінив застарілий NSURLConnection і став основним мережевим інструментом для розробників Apple. За даними Apple Developer Documentation (2025), URLSession обробляє понад 90% мережевого трафіку в додатках для iPhone та iPad.

Головне

  • URLSession — нативний API Apple для мережевих запитів, HTTP, завантаження файлів і WebSocket
  • Типи завдань: dataTask (запити), downloadTask (завантаження), uploadTask (відправлення), webSocketTask
  • Конфігурація сесії визначає поведінку: кешування, тайм-аути, проксі, облікові дані
  • Асинхронність реалізується через замикання, делегати або сучасний async/await
  • Фонові сесії дозволяють завантажувати дані навіть при згорнутому додатку

Що таке URLSession?

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

Архітектура URLSession складається з трьох ключових компонентів: конфігурація сесії, сама сесія та завдання (tasks). Кожен компонент відповідає за свій аспект мережевої взаємодії, і їх комбінація визначає поведінку додатка при роботі з мережею.

URLSessionConfiguration

Конфігурація задає параметри сесії — від тайм-аутів до політик кешування. Існує три типи: .default (стандартна з дисковим кешем), .ephemeral (без збереження кешу та cookie) та .background (для фонового завантаження). У конфігурації можна задати максимальну кількість з'єднань на хост, тайм-аут запиту та ресурсу, політику TLS та проксі.

Типи URLSessionTask

URLSessionTask — базовий клас для всіх мережевих операцій. Основні підкласи: URLSessionDataTask для GET та POST запитів з поверненням даних у пам'яті, URLSessionDownloadTask для завантаження файлів на диск, URLSessionUploadTask для відправлення файлів на сервер та URLSessionWebSocketTask для роботи з WebSocket з iOS 13.

Делегати URLSession

Делегат сесії отримує події про хід виконання завдань: отримання даних, завершення завантаження, помилки аутентифікації, редиректи. URLSessionDelegate та його підпротоколи дозволяють перехоплювати сертифікати TLS при аутентифікації, керувати кешуванням відповідей через URLCache та моніторити прогрес завантаження великих файлів. Альтернативно можна використовувати замикання (completion handlers) для простих випадків, коли не потрібна обробка проміжних подій.

Як виконувати запити з URLSession

Базовий сценарій роботи з URLSession виглядає так: створюється конфігурація, на її основі — сесія, потім через сесію створюється завдання з URL-запитом, і завдання запускається. Розберемо приклад GET-запиту із замиканням. Цей патерн використовується в більшості 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 — синглтон з конфігурацією .default для простих запитів. dataTask створює асинхронну операцію, але не запускає її — обов'язково викликати resume(). Замикання спрацьовує після завершення запиту та повертає data, response або error. Для кастомної сесії з власною конфігурацією використовуйте ініціалізатор URLSession(configuration:), який дозволяє задати політики кешування, тайм-аути, максимальну кількість з'єднань, HTTP-заголовки за замовчуванням та налаштування проксі для всіх завдань сесії. Такий підхід дає повний контроль над поведінкою мережі в додатку.

Завантаження файлів через URLSession

URLSession підтримує завантаження файлів з можливістю призупинення та відновлення, а також фонове завантаження. DownloadTask зберігає файл у тимчасову директорію, а в замиканні completion потрібно перемістити його в постійне місце.

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 у замиканні вказує на тимчасовий файл, який потрібно перемістити, інакше система видалить його після виходу із замикання. Для відстеження прогресу використовується делегат URLSessionDownloadDelegate з методом didWriteData, який передає кількість записаних байт та загальний розмір файлу — ці дані можна використовувати для відображення прогрес-бару в інтерфейсі користувача. Фонові сесії з downloadTask дозволяють продовжувати завантаження навіть після згортання додатка, а при завершенні система викликає обробник в AppDelegate.

URLSession vs Alamofire

Alamofire — це Swift-бібліотека, побудована поверх URLSession, яка надає більш декларативний інтерфейс. Вибір між нативним API та Alamofire залежить від складності проекту та вподобань команди.

КритерійURLSessionAlamofire
ЗалежностіНемає, вбудовано в FoundationВимагає SPM або CocoaPods
СинтаксисІмперативний із замиканнямиДекларативний з ланцюжками
Обробка JSONJSONSerialization вручнуresponseDecodable з Codable
ПерехоплювачіЧерез делегатиRequestInterceptor, EventMonitor
ПрогресЧерез делегатdownloadProgress, uploadProgress

Для простих проектів URLSession достатній і не додає залежностей. Alamofire виправданий у проектах з безліччю мережевих запитів, складною обробкою помилок та вимогою лаконічного синтаксису. Обидві технології використовують спільний фундамент URLSessionConfiguration і сумісні одна з одною. При виборі варто враховувати, що URLSession повністю контролюється Apple і оновлюється разом з iOS, в той час як Alamofire вимагає підтримки сумісності з новими версіями ОС з боку розробників бібліотеки.

Приклади коду URLSession

Сучасний Swift підтримує async/await, який робить мережеві запити більш читабельними порівняно із замиканнями. Розглянемо той же 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також