URLSession — az API a hálózati kérésekhez iOS-ben és macOS-ben, a Foundation framework része, és egységes felületet biztosít a HTTP, HTTPS, háttérben történő letöltés és WebSocket használatához. Lecserélte az elavult NSURLConnection-t, és az Apple-fejlesztők fő hálózati eszközévé vált. A Apple Developer Documentation (2025) szerint a URLSession az iPhone és iPad alkalmazások hálózati forgalmának több mint 90%-át dolgozza fel.
Legfontosabb tudnivalók
URLSession — az API hálózati műveletekhez, amelyet az Apple az iOS 7-ben és macOS 10.9-ben vezetett be. Lecserélte az NSURLConnection-t, és rugalmasabb és erősebb modellt biztosított a hálózati munkához. A könyvtár támogatja a HTTP/1.1, HTTP/2, HTTP/3 és WebSocket protokollokat, valamint a háttér-munkameneteket az adatok letöltéséhez.
A URLSession fő előnye a régi NSURLConnection-nal szemben — a több egyidejű kapcsolat támogatása egyetlen munkameneten keresztül, testreszabható konfigurációk és a letöltések szüneteltetésének és folytatásának lehetősége. Munkamenet egy csoport hálózati feladatot egyesít közös beállításokkal: gyorsítótárazás, cookie-szabályzat, időtúllépések, TLS-tanúsítványok.
Az iOS-ben a URLSession együttműködik a rendszer DNS-gyorsítótárával, az energiafelügyelettel és a háttérfolyamatokkal. Amikor az alkalmazás minimalizálva van, a rendszer folytathatja az adatok letöltését egy háttér-munkameneten keresztül, és a befejezés után értesíti az alkalmazást egy befejezési kezelőn keresztül. A háttér-munkamenetek különösen hasznosak nagy fájlok letöltéséhez, tartalom frissítéséhez és adatok szinkronizálásához dokumentumokkal és médiafájlokkal dolgozó alkalmazásokban. A háttér-munkamenetekkel való munkához implementálni kell az URLSessionDelegate-et és át kell adni a konfiguráció azonosítóját a munkamenet létrehozásakor — a rendszer ezt az azonosítót használja a munkamenet helyreállításához az alkalmazás újraindítása után.
A URLSession fontos előnye a HTTP/2 és HTTP/3 támogatása. A HTTP/2 multiplexelése lehetővé teszi több kérés egyidejű küldését egyetlen TCP-kapcsolaton keresztül, ami csökkenti a késleltetést és a szerverterhelést. A HTTP/3, amely a QUIC protokollon alapul az UDP felett, még gyorsabb kapcsolatépítést biztosít a TCP-kézfogás kiküszöbölésével.
Az URLSession felépítése három kulcsfontosságú összetevőből áll: munkamenet-konfiguráció, maga a munkamenet és a feladatok (tasks). Minden összetevő a hálózati interakció egy-egy aspektusáért felelős, és ezek kombinációja határozza meg az alkalmazás viselkedését a hálózati munka során.
A konfiguráció beállítja a munkamenet paramétereit — az időtúllépésektől a gyorsítótárazási szabályzatokig. Három típus létezik: .default (normál lemezgyorsítótárral), .ephemeral (gyorsítótár és cookie-k mentése nélkül) és .background (háttérben történő letöltéshez). A konfigurációban beállítható a maximális kapcsolatok száma gazdagépenként, a kérés és erőforrás időtúllépése, a TLS-szabályzat és a proxy.
Az URLSessionTask — az alaposztály az összes hálózati művelethez. A fő alosztályok: URLSessionDataTask GET és POST kérésekhez adatok memóriában történő visszaadásával, URLSessionDownloadTask fájlok letöltéséhez a lemezre, URLSessionUploadTask fájlok szerverre küldéséhez és URLSessionWebSocketTask a WebSocket használatához iOS 13-tól.
A munkamenet delegáltja eseményeket kap a feladatok előrehaladásáról: adatok fogadása, letöltés befejezése, hitelesítési hibák, átirányítások. URLSessionDelegate és alprotokolljai lehetővé teszik a TLS-tanúsítványok elfogását hitelesítéskor, a válaszok gyorsítótárazásának kezelését URLCache-en keresztül és a nagy fájlok letöltésének nyomon követését. Alternatív megoldásként closure-ök (completion handlers) használhatók egyszerű esetekben, ahol nincs szükség köztes események feldolgozására.
Az URLSession-nel való munka alapforgatókönyve a következő: létrejön egy konfiguráció, ennek alapján egy munkamenet, majd a munkameneten keresztül létrejön egy feladat egy URL-kéréssel, és a feladat elindul. Nézzünk egy példát GET kérésre closure-rel. Ezt a mintát a legtöbb iOS-alkalmazás használja adatok lekérésére REST API-tól, képek betöltésére és felhőszolgáltatásokkal való interakcióra.
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("Hiba: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
A példában URLSession.shared van használva — egy szingleton .default konfigurációval egyszerű kérésekhez. A dataTask létrehoz egy aszinkron műveletet, de nem indítja el — kötelező meghívni a resume()-t. A closure a kérés befejezése után fut le, és visszaadja a data, response vagy error értékeket. Egyéni konfigurációval rendelkező munkamenethez használja az URLSession(configuration:) inicializálót, amely lehetővé teszi a gyorsítótárazási szabályzatok, időtúllépések, maximális kapcsolatszám, alapértelmezett HTTP-fejlécek és proxy-beállítások beállítását a munkamenet összes feladatához. Ez a megközelítés teljes ellenőrzést biztosít a hálózati viselkedés felett az alkalmazásban.
A URLSession támogatja a fájlok letöltését szüneteltetési és folytatási lehetőséggel, valamint a háttérben történő letöltést. DownloadTask elmenti a fájlt egy ideiglenes könyvtárba, és a befejezési closure-ben át kell helyezni egy állandó helyre.
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()
A location paraméter a closure-ben az ideiglenes fájlra mutat, amelyet át kell helyezni, különben a rendszer törli a closure elhagyása után. Az előrehaladás nyomon követéséhez a URLSessionDownloadDelegate delegáltat használjuk a didWriteData metódussal, amely átadja a beírt bájtok számát és a fájl teljes méretét — ezek az adatok felhasználhatók egy folyamatjelző sáv megjelenítéséhez a felhasználói felületen. A háttér-munkamenetek a downloadTask segítségével lehetővé teszik a letöltés folytatását még az alkalmazás minimalizálása után is, és a befejezést követően a rendszer meghívja a handlert az AppDelegate-ben.
Az Alamofire — egy Swift könyvtár, amely az URLSession tetejére épül, és deklaratívabb felületet biztosít. A natív API és az Alamofire közötti választás a projekt összetettségétől és a csapat preferenciáitól függ.
| Szempont | URLSession | Alamofire |
|---|---|---|
| Függőségek | Nincs, beépítve a Foundation-be | SPM vagy CocoaPods szükséges |
| Szintaxis | Imperatív closure-ökkel | Deklaratív láncokkal |
| JSON feldolgozás | JSONSerialization kézzel | responseDecodable a Codable-lel |
| Elfogók | Delegáltakon keresztül | RequestInterceptor, EventMonitor |
| Előrehaladás | Delegáltakon keresztül | downloadProgress, uploadProgress |
Egyszerű projektekhez a URLSession elegendő, és nem ad hozzá függőségeket. Az Alamofire olyan projektekben indokolt, ahol sok hálózati kérés, összetett hibakezelés és tömör szintaxis szükséges. Mindkét technológia a közös URLSessionConfiguration alapot használja, és kompatibilis egymással. A választásnál figyelembe kell venni, hogy az URLSession-t teljes mértékben az Apple ellenőrzi, és az iOS-sel együtt frissül, míg az Alamofire esetében a könyvtár fejlesztőinek kell biztosítaniuk a kompatibilitást az új OS-verziókkal.
A modern Swift támogatja az async/await-et, ami olvashatóbbá teszi a hálózati kéréseket a closure-ökhöz képest. Vizsgáljuk meg ugyanazt a GET kérést aszinkron szintaxis segítségével.
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
}
A data(from:) metódus iOS 15 és macOS 12 óta elérhető. Visszaad egy (Data, URLResponse) tuple-t, és hibát dob hálózati problémák esetén. A JSONDecoder egy Codable modellel automatikusan deszerializálja a választ — ez helyettesíti a körülményes JSONSerialization-t az előző példából.
POST kérésekhez JSON törzzsel az URLRequest használható, amelyben beállítható a metódus, a Content-Type fejlécek és a kérés törzse Data formátumban. Az async/await tömörré és érthetővé teszi ezt a folyamatot, a hibakezelés pedig egyszerű a do-catch blokkon keresztül.
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)
}
Gyakran Ismételt Kérdések
Az URLSession az NSURLConnection modern utódja, amelyet iOS 7-ben vezettek be. Fő különbségek: több kapcsolat támogatása munkameneteken keresztül, feladatok szüneteltetése és folytatása, háttérletöltés és WebSocket. NSURLConnection elavult, és nem ajánlott új projektekben használni.
Az előrehaladás nyomon követéséhez a URLSessionDownloadDelegate delegáltat használjuk a urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) metódussal. Alternatívaként a dataTask esetében feliratkozhat az URLSessionTaskDelegate-re, és frissítéseket kaphat a didSendBodyData-n keresztül.
A háttérletöltés a .background(withIdentifier:) konfiguráción keresztül állítható be. Az alkalmazás regisztrál egy befejezési kezelőt az AppDelegate-ben, és az eredményeket még minimalizálás vagy bezárás után is megkapja. A rendszer kezeli a letöltést, és értesíti az alkalmazást a sessionDidFinishEvents delegált segítségével.
Igen, iOS 13-tól az URLSession támogatja a WebSocketet a URLSessionWebSocketTask osztályon keresztül. A webSocketTask(with:) metódussal jön létre, és send, receive metódusokat biztosít szöveges és bináris üzenetek támogatásával, valamint ping/pong-ot a kapcsolat fenntartásához.
Az időtúllépések az URLSessionConfiguration-en keresztül állíthatók be: a timeoutIntervalForRequest (válaszra várás a kérésre) és a timeoutIntervalForResource (a teljes letöltés maximális ideje) tulajdonságokkal. Alapértelmezés: 60 másodperc a kérésre és 7 nap az erőforrásra.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is