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 — изворни Apple API за мрежне захтеве, HTTP, преузимање датотека и WebSocket
  • Типови задатака: dataTask (захтеви), downloadTask (преузимање), uploadTask (слање), webSocketTask
  • Конфигурација сесије одређује понашање: кеширање, тајм-аути, прокси, акредитиви
  • Асинхроност се реализује кроз closures, delegate-е или модерни 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 кешом, управљањем енергијом и позадинским процесима. Када је апликација сведена, систем може да настави преузимање података кроз позадинску сесију, а по завршетку обавести апликацију преко handler-а за завршетак. Позадинске сесије су посебно корисне за преузимање великих датотека, ажурирање садржаја и синхронизацију података у апликацијама за рад са документима и медијским датотекама. За рад са позадинским сесијама потребно је имплементирати delegate URLSessionDelegate и проследити идентификатор конфигурације приликом креирања сесије — систем користи овај идентификатор за обнављање сесије након поновног покретања апликације.

Важна предност URLSession-а је подршка за HTTP/2 и HTTP/3. Мултиплексирање HTTP/2 омогућава слање више захтева кроз једну TCP везу, што смањује кашњење и оптерећење сервера. HTTP/3, заснован на QUIC протоколу преко UDP-а, обезбеђује још брже успостављање везе елиминацијом TCP руковања.

Архитектура URLSession-а

Архитектура URLSession-а се састоји од три кључне компоненте: конфигурације сесије, саме сесије и задатака (tasks). Свака компонента је одговорна за свој аспект мрежне интеракције, а њихова комбинација одређује понашање апликације при раду са мрежом.

URLSessionConfiguration

Конфигурација поставља параметре сесије — од тајм-аута до политика кеширања. Постоје три типа: .default (стандардна са диском кешом), .ephemeral (без чувања кеша и колачића) и .background (за позадинско преузимање). У конфигурацији се може поставити максималан број веза по хосту, тајм-аут захтева и ресурса, TLS политика и прокси.

Типови задатака URLSessionTask

URLSessionTask — основна класа за све мрежне операције. Главне подкласе: URLSessionDataTask за GET и POST захтеве са враћањем података у меморији, URLSessionDownloadTask за преузимање датотека на диск, URLSessionUploadTask за слање датотека на сервер и URLSessionWebSocketTask за рад са WebSocket-ом од iOS 13.

Delegate-и 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 — синглтон са .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
СинтаксаИмперативна са closure-имаДекларативна са ланцима
Обрада JSON-аJSONSerialization ручноresponseDecodable са Codable
ПресретачиКроз delegate-еRequestInterceptor, EventMonitor
НапредакКроз delegate-аdownloadProgress, uploadProgress

За једноставне пројекте URLSession је довољан и не додаје зависности. Alamofire је оправдан у пројектима са много мрежних захтева, сложеном обрадом грешака и потребом за концизном синтаксом. Обе технологије користе заједнички темељ URLSessionConfiguration и компатибилне су једна с другом. При избору треба узети у обзир да URLSession у потпуности контролише Apple и ажурира се заједно са iOS-ом, док Alamofire захтева подршку компатибилности са новим верзијама оперативног система од стране програмера библиотеке.

Примери кода URLSession-а

Модерни Swift подржава async/await, који чини мрежне захтеве читљивијим у поређењу са closure-има. Размотримо исти 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-у?

За праћење напретка користи се 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 — изворни Apple API за мрежне захтеве, који подржава HTTP, позадинско преузимање и WebSocket
  • Три типа конфигурације (.default, .ephemeral, .background) одређују понашање сесије
  • Четири типа задатака покривају све сценарије: dataTask, downloadTask, uploadTask, webSocketTask
  • Delegate-и омогућавају управљање аутентификацијом, напретком и преусмеравањима
  • Async/await од iOS 15 чини URLSession код читљивијим и концизнијим
  • Избор URLSession или Alamofire зависи од обима пројекта — URLSession је довољан за једноставне задатке

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође