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 — подршка за више истовремених веза кроз јединствену сесију, прилагодљиве конфигурације и могућност заустављања и настављања преузимања. Сесија обједињује групу мрежних задатака са заједничким подешавањима: кеширање, политика колачића, тајм-аути, TLS сертификати.
У iOS-у, URLSession ради са системским DNS кешом, управљањем енергијом и позадинским процесима. Када је апликација сведена, систем може да настави преузимање података кроз позадинску сесију, а по завршетку обавести апликацију преко handler-а за завршетак. Позадинске сесије су посебно корисне за преузимање великих датотека, ажурирање садржаја и синхронизацију података у апликацијама за рад са документима и медијским датотекама. За рад са позадинским сесијама потребно је имплементирати delegate URLSessionDelegate и проследити идентификатор конфигурације приликом креирања сесије — систем користи овај идентификатор за обнављање сесије након поновног покретања апликације.
Важна предност URLSession-а је подршка за HTTP/2 и HTTP/3. Мултиплексирање HTTP/2 омогућава слање више захтева кроз једну TCP везу, што смањује кашњење и оптерећење сервера. HTTP/3, заснован на QUIC протоколу преко UDP-а, обезбеђује још брже успостављање везе елиминацијом TCP руковања.
Архитектура URLSession-а се састоји од три кључне компоненте: конфигурације сесије, саме сесије и задатака (tasks). Свака компонента је одговорна за свој аспект мрежне интеракције, а њихова комбинација одређује понашање апликације при раду са мрежом.
Конфигурација поставља параметре сесије — од тајм-аута до политика кеширања. Постоје три типа: .default (стандардна са диском кешом), .ephemeral (без чувања кеша и колачића) и .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 — синглтон са .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 |
| Синтакса | Императивна са closure-има | Декларативна са ланцима |
| Обрада JSON-а | JSONSerialization ручно | responseDecodable са Codable |
| Пресретачи | Кроз delegate-е | RequestInterceptor, EventMonitor |
| Напредак | Кроз delegate-а | downloadProgress, uploadProgress |
За једноставне пројекте URLSession је довољан и не додаје зависности. Alamofire је оправдан у пројектима са много мрежних захтева, сложеном обрадом грешака и потребом за концизном синтаксом. Обе технологије користе заједнички темељ URLSessionConfiguration и компатибилне су једна с другом. При избору треба узети у обзир да URLSession у потпуности контролише Apple и ажурира се заједно са iOS-ом, док Alamofire захтева подршку компатибилности са новим верзијама оперативног система од стране програмера библиотеке.
Модерни Swift подржава async/await, који чини мрежне захтеве читљивијим у поређењу са closure-има. Размотримо исти 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 је застарео и не препоручује се за употребу у новим пројектима.
За праћење напретка користи се 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 креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође