URLSession — este API-ul pentru cereri de rețea în iOS și macOS, parte a framework-ului Foundation, care oferă o interfață unică pentru lucrul cu HTTP, HTTPS, descărcarea în fundal și WebSocket. A înlocuit NSURLConnection învechit și a devenit instrumentul principal de rețea pentru dezvoltatorii Apple. Conform Apple Developer Documentation (2025), URLSession procesează peste 90% din traficul de rețea în aplicațiile pentru iPhone și iPad.
Principalele
URLSession — este API-ul pentru operațiuni de rețea, introdus de Apple în iOS 7 și macOS 10.9. A înlocuit NSURLConnection și a oferit un model mai flexibil și mai puternic pentru lucrul cu rețeaua. Biblioteca suportă HTTP/1.1, HTTP/2, HTTP/3 și WebSocket, precum și sesiuni în fundal pentru descărcarea datelor.
Principalul avantaj al URLSession față de vechiul NSURLConnection — suportul pentru conexiuni simultane multiple printr-o singură sesiune, configurații personalizabile și posibilitatea de a întrerupe și relua descărcările. Sesiunea grupează un set de sarcini de rețea cu setări comune: cache, politica cookie, timeout-uri, certificate TLS.
În iOS, URLSession lucrează cu cache-ul DNS de sistem, gestionarea energiei și procesele de fundal. Când aplicația este minimizată, sistemul poate continua descărcarea datelor printr-o sesiune în fundal, iar după finalizare, notifică aplicația printr-un handler de finalizare. Sesiunile în fundal sunt deosebit de utile pentru descărcarea fișierelor mari, actualizarea conținutului și sincronizarea datelor în aplicațiile de lucru cu documente și fișiere media. Pentru lucrul cu sesiunile în fundal, trebuie implementat delegatul URLSessionDelegate și transmis identificatorul de configurare la crearea sesiunii — sistemul folosește acest identificator pentru restabilirea sesiunii după repornirea aplicației.
Un avantaj important al URLSession este suportul pentru HTTP/2 și HTTP/3. Multiplexarea HTTP/2 permite trimiterea mai multor cereri printr-o singură conexiune TCP, reducând întârzierile și încărcarea serverului. HTTP/3, bazat pe protocolul QUIC peste UDP, asigură o stabilire și mai rapidă a conexiunii prin eliminarea handshake-ului TCP.
Arhitectura URLSession este formată din trei componente cheie: configurarea sesiunii, sesiunea propriu-zisă și sarcinile (tasks). Fiecare componentă răspunde de un aspect specific al interacțiunii de rețea, iar combinația lor determină comportamentul aplicației la lucrul cu rețeaua.
Configurarea stabilește parametrii sesiunii — de la timeout-uri la politici de cache. Există trei tipuri: .default (standard cu cache pe disc), .ephemeral (fără salvare cache și cookie) și .background (pentru descărcare în fundal). În configurare se poate seta numărul maxim de conexiuni per gazdă, timeout-ul cererii și resursei, politica TLS și proxy.
URLSessionTask — clasa de bază pentru toate operațiunile de rețea. Subclasele principale: URLSessionDataTask pentru cereri GET și POST cu returnarea datelor în memorie, URLSessionDownloadTask pentru descărcarea fișierelor pe disc, URLSessionUploadTask pentru trimiterea fișierelor pe server și URLSessionWebSocketTask pentru lucrul cu WebSocket din iOS 13.
Delegatul sesiunii primește evenimente despre progresul sarcinilor: primirea datelor, finalizarea descărcării, erori de autentificare, redirecționări. URLSessionDelegate și subprotocoalele sale permit interceptarea certificatelor TLS la autentificare, gestionarea cache-ului răspunsurilor prin URLCache și monitorizarea progresului descărcării fișierelor mari. Alternativ, se pot folosi closure-uri (completion handlers) în cazuri simple când nu este necesară procesarea evenimentelor intermediare.
Scenariul de bază de lucru cu URLSession arată astfel: se creează o configurare, pe baza ei — o sesiune, apoi prin sesiune se creează o sarcină cu o cerere URL, iar sarcina este pornită. Să analizăm un exemplu de cerere GET cu closure. Acest model este folosit în majoritatea aplicațiilor iOS pentru a obține date de la REST API, a încărca imagini și a interacționa cu servicii cloud.
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("Eroare: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
În exemplu se folosește URLSession.shared — un singleton cu configurarea .default pentru cereri simple. dataTask creează o operațiune asincronă, dar nu o pornește — este obligatoriu să se apeleze resume(). Closure-ul se execută după finalizarea cererii și returnează data, response sau error. Pentru o sesiune personalizată cu propria configurare, utilizați inițializatorul URLSession(configuration:), care permite setarea politicilor de cache, timeout-urilor, numărului maxim de conexiuni, antetelor HTTP implicite și setărilor de proxy pentru toate sarcinile sesiunii. Această abordare oferă control complet asupra comportamentului rețelei în aplicație.
URLSession suportă descărcarea fișierelor cu posibilitatea de întrerupere și reluare, precum și descărcarea în fundal. DownloadTask salvează fișierul într-un director temporar, iar în closure-ul de finalizare trebuie mutat într-o locație permanentă.
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()
Parametrul location din closure indică fișierul temporar care trebuie mutat, altfel sistemul îl va șterge după ieșirea din closure. Pentru urmărirea progresului se folosește delegatul URLSessionDownloadDelegate cu metoda didWriteData, care transmite numărul de octeți scriși și dimensiunea totală a fișierului — aceste date pot fi folosite pentru afișarea unei bare de progres în interfața utilizatorului. Sesiunile în fundal cu downloadTask permit continuarea descărcării chiar și după minimizarea aplicației, iar la finalizare sistemul apelează handler-ul în AppDelegate.
Alamofire — este o bibliotecă Swift construită pe baza URLSession, care oferă o interfață mai declarativă. Alegerea între API-ul nativ și Alamofire depinde de complexitatea proiectului și preferințele echipei.
| Criteriu | URLSession | Alamofire |
|---|---|---|
| Dependențe | Nu, încorporat în Foundation | Necesită SPM sau CocoaPods |
| Sintaxa | Imperativă cu closure-uri | Declarativă cu lanțuri |
| Procesarea JSON | JSONSerialization manual | responseDecodable cu Codable |
| Interceptorii | Prin delegați | RequestInterceptor, EventMonitor |
| Progresul | Prin delegat | downloadProgress, uploadProgress |
Pentru proiecte simple URLSession este suficient și nu adaugă dependențe. Alamofire este justificat în proiecte cu multe cereri de rețea, gestionare complexă a erorilor și cerința unei sintaxe concise. Ambele tehnologii folosesc fundamentul comun URLSessionConfiguration și sunt compatibile între ele. La alegere, trebuie de luat în considerare că URLSession este complet controlat de Apple și se actualizează odată cu iOS, în timp ce Alamofire necesită suport de compatibilitate cu noile versiuni de OS din partea dezvoltatorilor bibliotecii.
Swift modern suportă async/await, care face cererile de rețea mai lizibile comparativ cu closure-urile. Să analizăm aceeași cerere GET folosind sintaxa asincronă.
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:) este disponibilă din iOS 15 și macOS 12. Returnează un tuplu (Data, URLResponse) și aruncă o eroare la probleme de rețea. JSONDecoder cu modelul Codable deserializază automat răspunsul — înlocuind voluminoasa JSONSerialization din exemplul anterior.
Pentru cererile POST cu corp JSON se folosește URLRequest, în care se configurează metoda, antetele Content-Type și corpul cererii sub formă de Data. Async/await face acest proces concis și clar, iar gestionarea erorilor este simplă prin blocul 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)
}
Întrebări frecvente
URLSession este înlocuitorul modern al NSURLConnection, introdus în iOS 7. Principalele diferențe: suport pentru conexiuni multiple prin sesiuni, întreruperea și reluarea sarcinilor, descărcarea în fundal și WebSocket. NSURLConnection este învechit și nu este recomandat pentru utilizare în proiecte noi.
Pentru urmărirea progresului se folosește delegatul URLSessionDownloadDelegate cu metoda urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Alternativ, pentru dataTask se poate abona la URLSessionTaskDelegate și primi actualizări prin didSendBodyData.
Descărcarea în fundal se configurează prin .background(withIdentifier:). Aplicația înregistrează un handler de finalizare în AppDelegate și primește rezultatele chiar și după minimizare sau închidere. Sistemul gestionează descărcarea și notifică aplicația prin delegatul sessionDidFinishEvents.
Da, din iOS 13 URLSession suportă WebSocket prin clasa URLSessionWebSocketTask. Se creează prin metoda webSocketTask(with:) și oferă metodele send, receive cu suport pentru mesaje text și binare, precum și ping/pong pentru menținerea conexiunii.
Timeout-urile se configurează prin URLSessionConfiguration: proprietățile timeoutIntervalForRequest (așteptarea răspunsului la cerere) și timeoutIntervalForResource (timpul maxim total al descărcării). Implicit: 60 de secunde pentru cerere și 7 zile pentru resursă.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și