URLSession — is de API voor netwerkverzoeken in iOS en macOS, onderdeel van het Foundation framework en biedt een uniforme interface voor werken met HTTP, HTTPS, achtergronddownloads en WebSocket. Het heeft de verouderde NSURLConnection vervangen en is het belangrijkste netwerktool geworden voor Apple-ontwikkelaars. Volgens Apple Developer Documentation (2025), verwerkt URLSession meer dan 90% van het netwerkverkeer in apps voor iPhone en iPad.
Belangrijkste punten
URLSession — is de API voor netwerkbewerkingen, geïntroduceerd door Apple in iOS 7 en macOS 10.9. Het heeft NSURLConnection vervangen en biedt een flexibeler en krachtiger model voor werken met het netwerk. De bibliotheek ondersteunt HTTP/1.1, HTTP/2, HTTP/3 en WebSocket, evenals achtergrondsessies voor het downloaden van gegevens.
Het belangrijkste voordeel van URLSession ten opzichte van de oude NSURLConnection — ondersteuning voor meerdere gelijktijdige verbindingen via één sessie, aanpasbare configuraties en de mogelijkheid om downloads te pauzeren en hervatten. Een sessie groepeert een set netwerktaken met gemeenschappelijke instellingen: caching, cookie-beleid, time-outs, TLS-certificaten.
In iOS werkt URLSession samen met de systeem-DNS-cache, energiebeheer en achtergrondprocessen. Wanneer de app wordt geminimaliseerd, kan het systeem doorgaan met het downloaden van gegevens via een achtergrondsessie en na voltooiing de app op de hoogte stellen via een voltooiingshandler. Achtergrondsessies zijn vooral nuttig voor het downloaden van grote bestanden, het bijwerken van inhoud en het synchroniseren van gegevens in apps voor document- en mediabewerking. Voor werken met achtergrondsessies moet de URLSessionDelegate worden geïmplementeerd en de configuratie-ID worden doorgegeven bij het maken van de sessie — het systeem gebruikt deze ID om de sessie te herstellen na het opnieuw opstarten van de app.
Een belangrijk voordeel van URLSession is de ondersteuning voor HTTP/2 en HTTP/3. Multiplexing van HTTP/2 maakt het mogelijk om meerdere verzoeken via één TCP-verbinding te verzenden, wat de latentie en serverbelasting vermindert. HTTP/3, gebaseerd op het QUIC-protocol over UDP, zorgt voor een nog snellere verbindingsopbouw door het elimineren van de TCP-handshake.
De architectuur van URLSession bestaat uit drie belangrijke componenten: de sessieconfiguratie, de sessie zelf en de taken (tasks). Elk component is verantwoordelijk voor een aspect van de netwerkinteractie, en hun combinatie bepaalt het gedrag van de app tijdens het werken met het netwerk.
De configuratie stelt de sessieparameters in — van time-outs tot caching-beleid. Er zijn drie typen: .default (standaard met schijfcache), .ephemeral (zonder cache en cookies op te slaan) en .background (voor achtergronddownloads). In de configuratie kunnen het maximale aantal verbindingen per host, de time-out voor verzoeken en bronnen, het TLS-beleid en proxy worden ingesteld.
URLSessionTask — de basisklasse voor alle netwerkbewerkingen. De belangrijkste subklassen: URLSessionDataTask voor GET- en POST-verzoeken met gegevensretour in het geheugen, URLSessionDownloadTask voor het downloaden van bestanden naar schijf, URLSessionUploadTask voor het verzenden van bestanden naar de server en URLSessionWebSocketTask voor werken met WebSocket vanaf iOS 13.
De sessiedelegate ontvangt gebeurtenissen over de voortgang van taken: gegevensontvangst, voltooiing van download, authenticatiefouten, omleidingen. URLSessionDelegate en zijn subprotocollen maken het mogelijk om TLS-certificaten bij authenticatie te onderscheppen, het cachen van antwoorden via URLCache te beheren en de voortgang van het downloaden van grote bestanden te bewaken. Als alternatief kunnen closures (completion handlers) worden gebruikt in eenvoudige gevallen waar geen verwerking van tussenliggende gebeurtenissen nodig is.
Het basisscenario voor werken met URLSession ziet er als volgt uit: er wordt een configuratie gemaakt, op basis daarvan een sessie, vervolgens wordt via de sessie een taak met een URL-verzoek gemaakt en de taak wordt gestart. Laten we een voorbeeld van een GET-verzoek met een closure bekijken. Dit patroon wordt gebruikt in de meeste iOS-apps voor het ophalen van gegevens van REST API's, het laden van afbeeldingen en interactie met cloudservices.
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("Fout: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
In het voorbeeld wordt URLSession.shared gebruikt — een singleton met .default-configuratie voor eenvoudige verzoeken. dataTask creëert een asynchrone bewerking, maar start deze niet — er moet per se resume() worden aangeroepen. De closure wordt uitgevoerd na voltooiing van het verzoek en retourneert data, response of error. Voor een aangepaste sessie met eigen configuratie gebruikt u de initialisator URLSession(configuration:), waarmee u caching-beleid, time-outs, het maximale aantal verbindingen, standaard HTTP-headers en proxy-instellingen voor alle sessietaken kunt instellen. Deze benadering geeft volledige controle over het netwerkgedrag in de app.
URLSession ondersteunt het downloaden van bestanden met de mogelijkheid om te pauzeren en hervatten, evenals achtergronddownloads. DownloadTask slaat het bestand op in een tijdelijke map, en in de voltooiingsclosure moet het naar een permanente locatie worden verplaatst.
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()
De parameter location in de closure verwijst naar het tijdelijke bestand dat moet worden verplaatst, anders verwijdert het systeem het na het verlaten van de closure. Voor het bijhouden van de voortgang wordt de delegate URLSessionDownloadDelegate gebruikt met de methode didWriteData, die het aantal geschreven bytes en de totale bestandsgrootte doorgeeft — deze gegevens kunnen worden gebruikt om een voortgangsbalk in de gebruikersinterface weer te geven. Achtergrondsessies met downloadTask maken het mogelijk om door te gaan met downloaden, zelfs nadat de app is geminimaliseerd, en na voltooiing roept het systeem de handler in AppDelegate aan.
Alamofire — is een Swift-bibliotheek gebouwd op URLSession die een meer declaratieve interface biedt. De keuze tussen de native API en Alamofire hangt af van de complexiteit van het project en de voorkeuren van het team.
| Criterium | URLSession | Alamofire |
|---|---|---|
| Afhankelijkheden | Geen, ingebouwd in Foundation | Vereist SPM of CocoaPods |
| Syntax | Imperatief met closures | Declaratief met ketens |
| JSON-verwerking | JSONSerialization handmatig | responseDecodable met Codable |
| Interceptors | Via delegates | RequestInterceptor, EventMonitor |
| Voortgang | Via delegate | downloadProgress, uploadProgress |
Voor eenvoudige projecten is URLSession voldoende en voegt geen afhankelijkheden toe. Alamofire is gerechtvaardigd in projecten met veel netwerkverzoeken, complexe foutafhandeling en de behoefte aan beknopte syntax. Beide technologieën gebruiken de gemeenschappelijke basis URLSessionConfiguration en zijn compatibel met elkaar. Bij de keuze moet worden overwogen dat URLSession volledig door Apple wordt gecontroleerd en wordt bijgewerkt met iOS, terwijl Alamofire compatibiliteitsondersteuning voor nieuwe OS-versies vereist van de bibliotheekontwikkelaars.
Modern Swift ondersteunt async/await, wat netwerkverzoeken leesbaarder maakt in vergelijking met closures. Laten we hetzelfde GET-verzoek bekijken met asynchrone 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
}
De methode data(from:) is beschikbaar vanaf iOS 15 en macOS 12. Het retourneert een tuple (Data, URLResponse) en gooit een fout bij netwerkproblemen. JSONDecoder met een Codable-model deserialiseert automatisch het antwoord — dit vervangt de omslachtige JSONSerialization uit het vorige voorbeeld.
Voor POST-verzoeken met een JSON-body wordt URLRequest gebruikt, waarin de methode, Content-Type-headers en de body van het verzoek als Data worden geconfigureerd. Async/await maakt dit proces beknopt en duidelijk, en foutafhandeling is eenvoudig via een do-catch-blok.
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)
}
Veelgestelde vragen
URLSession is de moderne vervanging van NSURLConnection, geïntroduceerd in iOS 7. Belangrijkste verschillen: ondersteuning voor meerdere verbindingen via sessies, pauzeren en hervatten van taken, achtergronddownloads en WebSocket. NSURLConnection is verouderd en wordt niet aanbevolen voor nieuwe projecten.
Voor het volgen van de voortgang wordt de delegate URLSessionDownloadDelegate gebruikt met de methode urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Alternatief kunt u voor dataTask abonneren op URLSessionTaskDelegate en updates ontvangen via didSendBodyData.
Achtergronddownload wordt geconfigureerd via .background(withIdentifier:). De app registreert een voltooiingshandler in AppDelegate en ontvangt resultaten, zelfs na minimaliseren of sluiten. Het systeem beheert de download en stelt de app op de hoogte via de delegate sessionDidFinishEvents.
Ja, vanaf iOS 13 ondersteunt URLSession WebSocket via de klasse URLSessionWebSocketTask. Het wordt gemaakt met de methode webSocketTask(with:) en biedt methoden send, receive met ondersteuning voor tekst- en binaire berichten, evenals ping/pong voor het behouden van de verbinding.
Time-outs worden geconfigureerd via URLSessionConfiguration: de eigenschappen timeoutIntervalForRequest (wachten op antwoord op verzoek) en timeoutIntervalForResource (maximale tijd voor de gehele download). Standaard: 60 seconden voor het verzoek en 7 dagen voor de bron.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook