URLSession — ce este, API-ul de rețea și cum funcționează în iOS

Autor: IT Sectr Publicat: 2026-03-07 Timp de citire: 8 min

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 — API-ul nativ Apple pentru cereri de rețea, HTTP, descărcare fișiere și WebSocket
  • Tipuri de sarcini: dataTask (cereri), downloadTask (descărcare), uploadTask (încărcare), webSocketTask
  • Configurația sesiunii determină comportamentul: cache, timeout-uri, proxy, date de autentificare
  • Asincronismul se realizează prin closure-uri, delegați sau modernul async/await
  • Sesiunile în fundal permit descărcarea datelor chiar și când aplicația este minimizată

Ce este URLSession?

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

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.

URLSessionConfiguration

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.

Tipuri de sarcini URLSessionTask

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.

Delegații URLSession

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.

Cum să efectuați cereri cu URLSession

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.

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

Descărcarea fișierelor prin URLSession

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

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

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.

URLSession vs Alamofire

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.

CriteriuURLSessionAlamofire
DependențeNu, încorporat în FoundationNecesită SPM sau CocoaPods
SintaxaImperativă cu closure-uriDeclarativă cu lanțuri
Procesarea JSONJSONSerialization manualresponseDecodable cu Codable
InterceptoriiPrin delegațiRequestInterceptor, EventMonitor
ProgresulPrin delegatdownloadProgress, 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.

Exemple de cod URLSession

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

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:) 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.

Cerere POST cu corp JSON

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.

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

Întrebări frecvente

Cu ce se deosebește URLSession de NSURLConnection?

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.

Cum să urmăresc progresul descărcării în URLSession?

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.

Cum să efectuez descărcarea în fundal cu URLSession?

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.

Pot folosi URLSession cu WebSocket?

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.

Cum să configurez timeout-ul în URLSession?

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

  • URLSession — API-ul nativ Apple pentru cereri de rețea, care suportă HTTP, descărcare în fundal și WebSocket
  • Trei tipuri de configurare (.default, .ephemeral, .background) determină comportamentul sesiunii
  • Patru tipuri de sarcini acoperă toate scenariile: dataTask, downloadTask, uploadTask, webSocketTask
  • Delegații permit gestionarea autentificării, progresului și redirecționărilor
  • Async/await din iOS 15 face codul URLSession mai lizibil și mai concis
  • Alegerea URLSession sau Alamofire depinde de amploarea proiectului — URLSession este suficient pentru sarcini simple

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.

Discutați proiectul

Citiți și