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 — ä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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
| Kriterium | URLSession | Alamofire |
|---|---|---|
| Beroenden | Inga, inbyggt i Foundation | Kräver SPM eller CocoaPods |
| Syntax | Imperativ med closures | Deklarativ med kedjor |
| JSON-hantering | JSONSerialization manuellt | responseDecodable med Codable |
| Interceptor | Via delegater | RequestInterceptor, EventMonitor |
| Framsteg | Via delegat | downloadProgress, 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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Läs också