URLSession — vad är det, nätverks-API och hur det fungerar i iOS

Författare: IT Sectr Publicerad: 2026-03-07 Lästid: 8 min

URLSession — är API:t för nätverksförfrågningar i iOS och macOS, en del av Foundation-ramverket och tillhandahåller ett enhetligt gränssnitt för arbete med HTTP, HTTPS, bakgrundsnedladdning och WebSocket. Det ersatte den föråldrade NSURLConnection och blev det främsta nätverksverktyget för Apple-utvecklare. Enligt Apple Developer Documentation (2025) bearbetar URLSession mer än 90% av nätverkstrafiken i applikationer för iPhone och iPad.

Huvudpunkter

  • URLSession — inbyggt Apple API för nätverksförfrågningar, HTTP, filnedladdning och WebSocket
  • Typer av uppgifter: dataTask (förfrågningar), downloadTask (nedladdning), uploadTask (uppladdning), webSocketTask
  • Konfiguration av sessionen bestämmer beteendet: cachning, timeout, proxy, inloggningsuppgifter
  • Asynkronitet implementeras via closures, delegater eller modern async/await
  • Bakgrundssessioner möjliggör nedladdning av data även när appen är minimerad

Vad är URLSession?

URLSession — är API:t för nätverksoperationer som introducerades av Apple i iOS 7 och macOS 10.9. Det ersatte NSURLConnection och gav en mer flexibel och kraftfull modell för att arbeta med nätverket. Biblioteket stöder HTTP/1.1, HTTP/2, HTTP/3 och WebSocket, samt bakgrundssessioner för nedladdning av data.

Den främsta fördelen med URLSession jämfört med den gamla NSURLConnection — stöd för flera samtidiga anslutningar via en enda session, anpassningsbara konfigurationer och möjligheten att pausa och återuppta nedladdningar. Session grupperar en uppsättning nätverksuppgifter med gemensamma inställningar: cachning, cookie-policy, timeout, TLS-certifikat.

I iOS arbetar URLSession med systemets DNS-cache, energihantering och bakgrundsprocesser. När appen minimeras kan systemet fortsätta att ladda ner data via en bakgrundssession och efter slutförande meddela appen via en slutförandehanterare. Bakgrundssessioner är särskilt användbara för nedladdning av stora filer, uppdatering av innehåll och synkronisering av data i applikationer för arbete med dokument och mediafiler. För att arbeta med bakgrundssessioner måste man implementera URLSessionDelegate och skicka konfigurationsidentifieraren när sessionen skapas — systemet använder denna identifierare för att återställa sessionen efter omstart av appen.

En viktig fördel med URLSession är stödet för HTTP/2 och HTTP/3. Multiplexering av HTTP/2 gör det möjligt att skicka flera förfrågningar via en enda TCP-anslutning, vilket minskar latens och serverbelastning. HTTP/3, baserat på QUIC-protokollet över UDP, ger ännu snabbare anslutningsetablering genom att eliminera TCP-handskakningen.

Arkitektur för URLSession

Arkitekturen för URLSession består av tre nyckelkomponenter: sessionskonfiguration, själva sessionen och uppgifter (tasks). Varje komponent ansvarar för en aspekt av nätverksinteraktionen, och deras kombination bestämmer applikationens beteende vid arbete med nätverket.

URLSessionConfiguration

Konfigurationen ställer in sessionsparametrar — från timeout till cachningspolicy. Det finns tre typer: .default (standard med diskcache), .ephemeral (utan att spara cache och cookies) och .background (för bakgrundsnedladdning). I konfigurationen kan man ställa in maximalt antal anslutningar per värd, timeout för förfrågan och resurs, TLS-policy och proxy.

Typer av URLSessionTask-uppgifter

URLSessionTask — basklassen för alla nätverksoperationer. Huvudunderklasser: URLSessionDataTask för GET- och POST-förfrågningar med dataåtergivning i minnet, URLSessionDownloadTask för nedladdning av filer till disk, URLSessionUploadTask för uppladdning av filer till servern och URLSessionWebSocketTask för arbete med WebSocket från iOS 13.

URLSession-delegater

Sessionsdelegaten tar emot händelser om uppgifternas framsteg: datamottagning, slutförd nedladdning, autentiseringsfel, omdirigeringar. URLSessionDelegate och dess underprotokoll gör det möjligt att fånga upp TLS-certifikat vid autentisering, hantera cachelagring av svar via URLCache och övervaka framsteg vid nedladdning av stora filer. Alternativt kan closures (completion handlers) användas i enkla fall där ingen bearbetning av mellanliggande händelser krävs.

Hur man gör förfrågningar med URLSession

Grundscenariot för att arbeta med URLSession ser ut så här: en konfiguration skapas, baserat på den — en session, sedan skapas via sessionen en uppgift med en URL-förfrågan, och uppgiften startas. Låt oss analysera ett exempel på en GET-förfrågan med en closure. Detta mönster används i de flesta iOS-applikationer för att hämta data från REST API, ladda bilder och interagera med molntjänster.

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("Fel: \(error!.localizedDescription)")
        return
    }
    if let json = try? JSONSerialization.jsonObject(with: data) {
        print("JSON: \(json)")
    }
}
task.resume()

I exemplet används URLSession.shared — en singleton med .default-konfiguration för enkla förfrågningar. dataTask skapar en asynkron operation men startar den inte — man måste anropa resume(). Clousuren exekveras efter att förfrågan slutförts och returnerar data, response eller error. För en anpassad session med egen konfiguration, använd initieraren URLSession(configuration:), som gör det möjligt att ställa in cachningspolicy, timeout, maximalt antal anslutningar, standard-HTTP-huvuden och proxyinställningar för alla sessionsuppgifter. Detta tillvägagångssätt ger full kontroll över nätverksbeteendet i applikationen.

Nedladdning av filer via URLSession

URLSession stöder nedladdning av filer med möjlighet att pausa och återuppta, samt bakgrundsnedladdning. DownloadTask sparar filen i en temporär katalog, och i slutförandeclosure måste den flyttas till en permanent plats.

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

Parametern location i closuren pekar på den temporära filen som måste flyttas, annars kommer systemet att ta bort den efter att closuren lämnas. För att spåra framsteg används delegaten URLSessionDownloadDelegate med metoden didWriteData, som överför antalet skrivna byte och filens totala storlek — dessa data kan användas för att visa en förloppsindikator i användargränssnittet. Bakgrundssessioner med downloadTask gör det möjligt att fortsätta nedladdningen även efter att appen minimerats, och efter slutförande anropar systemet hanteraren i AppDelegate.

URLSession vs Alamofire

Alamofire — är ett Swift-bibliotek byggt ovanpå URLSession som ger ett mer deklarativt gränssnitt. Valet mellan det inbyggda API:et och Alamofire beror på projektets komplexitet och teamets preferenser.

KriteriumURLSessionAlamofire
BeroendenInga, inbyggt i FoundationKräver SPM eller CocoaPods
SyntaxImperativ med closuresDeklarativ med kedjor
JSON-hanteringJSONSerialization manuelltresponseDecodable med Codable
InterceptorVia delegaterRequestInterceptor, EventMonitor
FramstegVia delegatdownloadProgress, uploadProgress

För enkla projekt är URLSession tillräckligt och lägger inte till beroenden. Alamofire är motiverat i projekt med många nätverksförfrågningar, komplex felhantering och krav på koncis syntax. Båda teknologierna använder den gemensamma grunden URLSessionConfiguration och är kompatibla med varandra. Vid valet bör man överväga att URLSession helt kontrolleras av Apple och uppdateras med iOS, medan Alamofire kräver kompatibilitetsstöd för nya OS-versioner från bibliotekets utvecklare.

Kodexempel för URLSession

Modern Swift stöder async/await, vilket gör nätverksförfrågningar mer läsbara jämfört med closures. Låt oss titta på samma GET-förfrågan med asynkron syntax.

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
}

Metoden data(from:) är tillgänglig från iOS 15 och macOS 12. Den returnerar en tupel (Data, URLResponse) och kastar ett fel vid nätverksproblem. JSONDecoder med en Codable-modell deserialiserar automatiskt svaret — detta ersätter den omständliga JSONSerialization från föregående exempel.

POST-förfrågan med JSON-kropp

För POST-förfrågningar med JSON-kropp används URLRequest, där metod, Content-Type-huvuden och förfrågans kropp som Data konfigureras. Async/await gör denna process koncis och tydlig, och felhantering är enkel via do-catch-block.

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

Vanliga frågor

Vad skiljer URLSession från NSURLConnection?

URLSession är den moderna ersättaren för NSURLConnection som introducerades i iOS 7. Huvudsakliga skillnader: stöd för flera anslutningar via sessioner, pausa och återuppta uppgifter, bakgrundsnedladdning och WebSocket. NSURLConnection är föråldrad och rekommenderas inte för användning i nya projekt.

Hur spårar jag nedladdningsframsteg i URLSession?

För att spåra framsteg används delegaten URLSessionDownloadDelegate med metoden urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Alternativt kan man för dataTask prenumerera på URLSessionTaskDelegate och få uppdateringar via didSendBodyData.

Hur utför jag bakgrundsnedladdning med URLSession?

Bakgrundsnedladdning konfigureras via .background(withIdentifier:). Appen registrerar en slutförandehanterare i AppDelegate och får resultat även efter minimering eller stängning. Systemet hanterar nedladdningen och meddelar appen via delegaten sessionDidFinishEvents.

Kan URLSession användas med WebSocket?

Ja, från iOS 13 stöder URLSession WebSocket via klassen URLSessionWebSocketTask. Den skapas med metoden webSocketTask(with:) och tillhandahåller metoderna send, receive med stöd för text- och binärmeddelanden, samt ping/pong för att upprätthålla anslutningen.

Hur ställer jag in timeout i URLSession?

Timeout ställs in via URLSessionConfiguration: egenskaperna timeoutIntervalForRequest (väntan på svar på förfrågan) och timeoutIntervalForResource (maximal tid för hela nedladdningen). Standardvärden: 60 sekunder för förfrågan och 7 dagar för resursen.

Sammanfattning

  • URLSession — inbyggt Apple API för nätverksförfrågningar, som stöder HTTP, bakgrundsnedladdning och WebSocket
  • Tre konfigurationstyper (.default, .ephemeral, .background) bestämmer sessionens beteende
  • Fyra uppgiftstyper täcker alla scenarier: dataTask, downloadTask, uploadTask, webSocketTask
  • Delegater möjliggör hantering av autentisering, framsteg och omdirigeringar
  • Async/await från iOS 15 gör URLSession-koden mer läsbar och koncis
  • Val av URLSession eller Alamofire beror på projektets omfattning — URLSession räcker för enkla uppgifter

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också