URLSession — je API pro síťové požadavky v iOS a macOS, součást Foundation frameworku, poskytující jednotné rozhraní pro práci s HTTP, HTTPS, stahováním na pozadí a WebSocket. Nahradil zastaralý NSURLConnection a stal se hlavním síťovým nástrojem pro Apple vývojáře. Podle Apple Developer Documentation (2025), URLSession zpracovává více než 90% síťového provozu v aplikacích pro iPhone a iPad.
Hlavní body
URLSession — je API pro síťové operace, představený Apple v iOS 7 a macOS 10.9. Nahradil NSURLConnection a poskytl flexibilnější a výkonnější model pro práci se sítí. Knihovna podporuje HTTP/1.1, HTTP/2, HTTP/3 a WebSocket, stejně jako relace na pozadí pro stahování dat.
Hlavní výhoda URLSession oproti starému NSURLConnection — podpora pro více současných připojení prostřednictvím jediné relace, přizpůsobitelné konfigurace a možnost pozastavit a obnovit stahování. Relace sdružuje skupinu síťových úloh se společným nastavením: ukládání do mezipaměti, politika cookies, časové limity, TLS certifikáty.
V iOS URLSession pracuje se systémovou DNS cache, správou energie a procesy na pozadí. Když je aplikace minimalizována, systém může pokračovat ve stahování dat prostřednictvím relace na pozadí a po dokončení informovat aplikaci pomocí handleru dokončení. Relace na pozadí jsou zvláště užitečné pro stahování velkých souborů, aktualizaci obsahu a synchronizaci dat v aplikacích pro práci s dokumenty a mediálními soubory. Pro práci s relacemi na pozadí je třeba implementovat delegáta URLSessionDelegate a předat identifikátor konfigurace při vytváření relace — systém používá tento identifikátor k obnovení relace po restartu aplikace.
Důležitou výhodou URLSession je podpora HTTP/2 a HTTP/3. Multiplexování HTTP/2 umožňuje odesílat více požadavků prostřednictvím jednoho TCP připojení, což snižuje zpoždění a zatížení serveru. HTTP/3, založený na protokolu QUIC nad UDP, zajišťuje ještě rychlejší navázání spojení odstraněním TCP handshake.
Architektura URLSession se skládá ze tří klíčových komponent: konfigurace relace, samotné relace a úloh (tasks). Každá komponenta je zodpovědná za svůj aspekt síťové interakce a jejich kombinace určuje chování aplikace při práci se sítí.
Konfigurace nastavuje parametry relace — od časových limitů po politiky ukládání do mezipaměti. Existují tři typy: .default (standardní s disk cache), .ephemeral (bez ukládání cache a cookies) a .background (pro stahování na pozadí). V konfiguraci lze nastavit maximální počet připojení na hostitele, časový limit požadavku a zdroje, politiku TLS a proxy.
URLSessionTask — základní třída pro všechny síťové operace. Hlavní podtřídy: URLSessionDataTask pro GET a POST požadavky s vracením dat v paměti, URLSessionDownloadTask pro stahování souborů na disk, URLSessionUploadTask pro odesílání souborů na server a URLSessionWebSocketTask pro práci s WebSocket od iOS 13.
Delegát relace přijímá události o průběhu úloh: příjem dat, dokončení stahování, chyby autentizace, přesměrování. URLSessionDelegate a jeho podprotokoly umožňují zachycovat TLS certifikáty při autentizaci, spravovat ukládání odpovědí do mezipaměti přes URLCache a monitorovat průběh stahování velkých souborů. Alternativně lze použít closures (completion handlers) v jednoduchých případech, kde není vyžadováno zpracování mezilehlých událostí.
Základní scénář práce s URLSession vypadá takto: vytvoří se konfigurace, na jejím základě relace, poté se prostřednictvím relace vytvoří úloha s URL požadavkem a úloha se spustí. Rozebereme příklad GET požadavku s closure. Tento vzor se používá ve většině iOS aplikací pro získávání dat z REST API, načítání obrázků a interakci s cloudovými službami.
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("Chyba: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
V příkladu se používá URLSession.shared — singleton s konfigurací .default pro jednoduché požadavky. dataTask vytváří asynchronní operaci, ale nespouští ji — je nutné zavolat resume(). Closure se provede po dokončení požadavku a vrátí data, response nebo error. Pro vlastní relaci s vlastní konfigurací použijte inicializátor URLSession(configuration:), který umožňuje nastavit politiky ukládání do mezipaměti, časové limity, maximální počet připojení, výchozí HTTP hlavičky a nastavení proxy pro všechny úlohy relace. Tento přístup poskytuje úplnou kontrolu nad chováním sítě v aplikaci.
URLSession podporuje stahování souborů s možností pozastavení a obnovení, stejně jako stahování na pozadí. DownloadTask ukládá soubor do dočasného adresáře a v closure dokončení je třeba jej přesunout na trvalé místo.
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()
Parametr location v closure ukazuje na dočasný soubor, který je třeba přesunout, jinak jej systém po opuštění closure smaže. Pro sledování průběhu se používá delegát URLSessionDownloadDelegate s metodou didWriteData, která předává počet zapsaných bajtů a celkovou velikost souboru — tato data lze použít k zobrazení ukazatele průběhu v uživatelském rozhraní. Relace na pozadí s downloadTask umožňují pokračovat ve stahování i po minimalizaci aplikace a po dokončení systém zavolá handler v AppDelegate.
Alamofire — je Swift knihovna postavená na URLSession, která poskytuje deklarativnější rozhraní. Volba mezi nativním API a Alamofire závisí na složitosti projektu a preferencích týmu.
| Kritérium | URLSession | Alamofire |
|---|---|---|
| Závislosti | Ne, vestavěný ve Foundation | Vyžaduje SPM nebo CocoaPods |
| Syntaxe | Imperativní s closures | Deklarativní s řetězci |
| Zpracování JSON | JSONSerialization ručně | responseDecodable s Codable |
| Zachycovače | Přes delegáty | RequestInterceptor, EventMonitor |
| Průběh | Přes delegáta | downloadProgress, uploadProgress |
Pro jednoduché projekty je URLSession dostačující a nepřidává závislosti. Alamofire je odůvodněný v projektech s mnoha síťovými požadavky, složitým zpracováním chyb a požadavkem na stručnou syntaxi. Obě technologie používají společný základ URLSessionConfiguration a jsou vzájemně kompatibilní. Při výběru je třeba zvážit, že URLSession je plně pod kontrolou Apple a aktualizuje se spolu s iOS, zatímco Alamofire vyžaduje podporu kompatibility s novými verzemi OS ze strany vývojářů knihovny.
Moderní Swift podporuje async/await, který činí síťové požadavky čitelnějšími ve srovnání s closures. Podívejme se na stejný GET požadavek s použitím asynchronní syntaxe.
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
}
Metoda data(from:) je dostupná od iOS 15 a macOS 12. Vrací n-tici (Data, URLResponse) a vyhazuje chybu při problémech se sítí. JSONDecoder s modelem Codable automaticky deserializuje odpověď — to nahrazuje zdlouhavý JSONSerialization z předchozího příkladu.
Pro POST požadavky s JSON tělem se používá URLRequest, ve kterém se nastavují metoda, hlavičky Content-Type a tělo požadavku ve formátu Data. Async/await činí tento proces stručným a přehledným a zpracování chyb je jednoduché pomocí bloku 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)
}
Často kladené otázky
URLSession je moderní náhrada NSURLConnection, představená v iOS 7. Hlavní rozdíly: podpora pro více připojení prostřednictvím relací, pozastavení a obnovení úloh, stahování na pozadí a WebSocket. NSURLConnection je zastaralý a nedoporučuje se používat v nových projektech.
Pro sledování průběhu se používá delegát URLSessionDownloadDelegate s metodou urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Alternativně se pro dataTask můžete přihlásit k odběru URLSessionTaskDelegate a dostávat aktualizace prostřednictvím didSendBodyData.
Stahování na pozadí se nastavuje prostřednictvím konfigurace .background(withIdentifier:). Aplikace zaregistruje handler dokončení v AppDelegate a obdrží výsledky i po minimalizaci nebo zavření. Systém spravuje stahování a informuje aplikaci prostřednictvím delegáta sessionDidFinishEvents.
Ano, od iOS 13 URLSession podporuje WebSocket prostřednictvím třídy URLSessionWebSocketTask. Vytváří se metodou webSocketTask(with:) a poskytuje metody send, receive s podporou pro textové a binární zprávy, stejně jako ping/pong pro udržení spojení.
Časové limity se nastavují prostřednictvím URLSessionConfiguration: vlastnosti timeoutIntervalForRequest (čekání na odpověď na požadavek) a timeoutIntervalForResource (maximální doba celého stahování). Výchozí: 60 sekund pro požadavek a 7 dní pro zdroj.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také