URLSession — co to je, síťové API a jak funguje v iOS

Autor: IT Sectr Publikováno: 2026-03-07 Doba čtení: 8 min

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 — nativní Apple API pro síťové požadavky, HTTP, stahování souborů a WebSocket
  • Typy úloh: dataTask (požadavky), downloadTask (stahování), uploadTask (odesílání), webSocketTask
  • Konfigurace relace určuje chování: ukládání do mezipaměti, časové limity, proxy, přihlašovací údaje
  • Asynchronnost se realizuje pomocí closures, delegátů nebo moderního async/await
  • Relace na pozadí umožňují stahování dat i při minimalizované aplikaci

Co je URLSession?

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

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í.

URLSessionConfiguration

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.

Typy úloh URLSessionTask

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áti URLSession

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í.

Jak provádět požadavky s URLSession

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.

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("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.

Stahování souborů přes URLSession

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.

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()

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.

URLSession vs Alamofire

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ériumURLSessionAlamofire
ZávislostiNe, vestavěný ve FoundationVyžaduje SPM nebo CocoaPods
SyntaxeImperativní s closuresDeklarativní s řetězci
Zpracování JSONJSONSerialization ručněresponseDecodable s Codable
ZachycovačePřes delegátyRequestInterceptor, EventMonitor
PrůběhPřes delegátadownloadProgress, 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.

Příklady kódu URLSession

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.

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
}

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.

POST požadavek s JSON tělem

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.

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)
}

Často kladené otázky

Čím se URLSession liší od NSURLConnection?

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.

Jak sledovat průběh stahování v URLSession?

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.

Jak provést stahování na pozadí s URLSession?

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.

Lze URLSession použít s WebSocket?

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í.

Jak nastavit časový limit v URLSession?

Č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í

  • URLSession — nativní Apple API pro síťové požadavky, podporující HTTP, stahování na pozadí a WebSocket
  • Tři typy konfigurace (.default, .ephemeral, .background) určují chování relace
  • Čtyři typy úloh pokrývají všechny scénáře: dataTask, downloadTask, uploadTask, webSocketTask
  • Delegáti umožňují správu autentizace, průběhu a přesměrování
  • Async/await od iOS 15 činí kód URLSession čitelnějším a stručnějším
  • Výběr URLSession nebo Alamofire závisí na rozsahu projektu — URLSession je dostačující pro jednoduché úkoly

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í.

Prodiskutovat projekt

Přečtěte si také