URLSession — adalah API untuk permintaan jaringan di iOS dan macOS, bagian dari Foundation framework yang menyediakan antarmuka terpadu untuk bekerja dengan HTTP, HTTPS, unduhan latar belakang, dan WebSocket. Ia menggantikan NSURLConnection yang sudah usang dan menjadi alat jaringan utama bagi pengembang Apple. Menurut Apple Developer Documentation (2025), URLSession memproses lebih dari 90% lalu lintas jaringan di aplikasi untuk iPhone dan iPad.
Poin Utama
URLSession — adalah API untuk operasi jaringan yang diperkenalkan oleh Apple di iOS 7 dan macOS 10.9. Ia menggantikan NSURLConnection dan menyediakan model yang lebih fleksibel dan kuat untuk bekerja dengan jaringan. Pustaka ini mendukung HTTP/1.1, HTTP/2, HTTP/3, dan WebSocket, serta sesi latar belakang untuk mengunduh data.
Keunggulan utama URLSession dibandingkan NSURLConnection lama — dukungan untuk beberapa koneksi simultan melalui satu sesi, konfigurasi yang dapat disesuaikan, dan kemampuan untuk menjeda dan melanjutkan unduhan. Sesi mengelompokkan sekumpulan tugas jaringan dengan pengaturan bersama: caching, kebijakan cookie, batas waktu, sertifikat TLS.
Di iOS, URLSession bekerja dengan cache DNS sistem, manajemen daya, dan proses latar belakang. Saat aplikasi diminimalkan, sistem dapat melanjutkan pengunduhan data melalui sesi latar belakang, dan setelah selesai, memberi tahu aplikasi melalui handler penyelesaian. Sesi latar belakang sangat berguna untuk mengunduh file besar, memperbarui konten, dan menyinkronkan data di aplikasi untuk bekerja dengan dokumen dan file media. Untuk bekerja dengan sesi latar belakang, perlu mengimplementasikan delegate URLSessionDelegate dan memberikan identifier konfigurasi saat membuat sesi — sistem menggunakan identifier ini untuk memulihkan sesi setelah aplikasi di-restart.
Keuntungan penting URLSession adalah dukungan untuk HTTP/2 dan HTTP/3. Multipleksing HTTP/2 memungkinkan pengiriman beberapa permintaan melalui satu koneksi TCP, yang mengurangi latensi dan beban server. HTTP/3, berdasarkan protokol QUIC di atas UDP, menyediakan pembentukan koneksi yang lebih cepat dengan menghilangkan jabat tangan TCP.
Arsitektur URLSession terdiri dari tiga komponen kunci: konfigurasi sesi, sesi itu sendiri, dan tugas (tasks). Setiap komponen bertanggung jawab atas aspek tertentu dari interaksi jaringan, dan kombinasinya menentukan perilaku aplikasi saat bekerja dengan jaringan.
Konfigurasi menetapkan parameter sesi — dari batas waktu hingga kebijakan caching. Ada tiga jenis: .default (standar dengan cache disk), .ephemeral (tanpa menyimpan cache dan cookie), dan .background (untuk unduhan latar belakang). Dalam konfigurasi dapat diatur jumlah maksimum koneksi per host, batas waktu permintaan dan sumber daya, kebijakan TLS, dan proksi.
URLSessionTask — kelas dasar untuk semua operasi jaringan. Subkelas utama: URLSessionDataTask untuk permintaan GET dan POST dengan pengembalian data di memori, URLSessionDownloadTask untuk mengunduh file ke disk, URLSessionUploadTask untuk mengirim file ke server, dan URLSessionWebSocketTask untuk bekerja dengan WebSocket sejak iOS 13.
Delegate sesi menerima peristiwa tentang kemajuan tugas: penerimaan data, penyelesaian unduhan, kesalahan autentikasi, pengalihan. URLSessionDelegate dan subprotokolnya memungkinkan untuk mencegat sertifikat TLS saat autentikasi, mengelola caching respons melalui URLCache, dan memantau kemajuan unduhan file besar. Alternatifnya, closure (completion handlers) dapat digunakan dalam kasus sederhana di mana pemrosesan peristiwa antara tidak diperlukan.
Skenario dasar bekerja dengan URLSession adalah sebagai berikut: dibuat konfigurasi, berdasarkan itu — sesi, kemudian melalui sesi dibuat tugas dengan permintaan URL, dan tugas dijalankan. Mari kita lihat contoh permintaan GET dengan closure. Pola ini digunakan di sebagian besar aplikasi iOS untuk mengambil data dari REST API, memuat gambar, dan berinteraksi dengan layanan 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("Kesalahan: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
Dalam contoh digunakan URLSession.shared — singleton dengan konfigurasi .default untuk permintaan sederhana. dataTask membuat operasi asinkron, tetapi tidak menjalankannya — harus memanggil resume(). Closure dijalankan setelah permintaan selesai dan mengembalikan data, response, atau error. Untuk sesi kustom dengan konfigurasi sendiri, gunakan inisialisasi URLSession(configuration:), yang memungkinkan pengaturan kebijakan caching, batas waktu, jumlah maksimum koneksi, header HTTP default, dan pengaturan proksi untuk semua tugas sesi. Pendekatan ini memberikan kontrol penuh atas perilaku jaringan di aplikasi.
URLSession mendukung pengunduhan file dengan kemampuan menjeda dan melanjutkan, serta unduhan latar belakang. DownloadTask menyimpan file ke direktori sementara, dan di closure penyelesaian harus dipindahkan ke lokasi permanen.
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()
Parameter location di closure menunjuk ke file sementara yang harus dipindahkan, jika tidak sistem akan menghapusnya setelah keluar dari closure. Untuk melacak kemajuan, digunakan delegate URLSessionDownloadDelegate dengan metode didWriteData, yang mengirimkan jumlah byte yang ditulis dan ukuran total file — data ini dapat digunakan untuk menampilkan bilah kemajuan di antarmuka pengguna. Sesi latar belakang dengan downloadTask memungkinkan melanjutkan unduhan bahkan setelah aplikasi diminimalkan, dan setelah selesai sistem memanggil handler di AppDelegate.
Alamofire — adalah pustaka Swift yang dibangun di atas URLSession yang menyediakan antarmuka yang lebih deklaratif. Pilihan antara API asli dan Alamofire tergantung pada kompleksitas proyek dan preferensi tim.
| Kriteria | URLSession | Alamofire |
|---|---|---|
| Ketergantungan | Tidak ada, bawaan Foundation | Memerlukan SPM atau CocoaPods |
| Sintaks | Imperatif dengan closure | Deklaratif dengan rantai |
| Pemrosesan JSON | JSONSerialization manual | responseDecodable dengan Codable |
| Interceptor | Melalui delegate | RequestInterceptor, EventMonitor |
| Kemajuan | Melalui delegate | downloadProgress, uploadProgress |
Untuk proyek sederhana URLSession sudah cukup dan tidak menambah ketergantungan. Alamofire dibenarkan dalam proyek dengan banyak permintaan jaringan, penanganan kesalahan yang kompleks, dan kebutuhan sintaks yang ringkas. Kedua teknologi menggunakan fondasi bersama URLSessionConfiguration dan kompatibel satu sama lain. Saat memilih, perlu dipertimbangkan bahwa URLSession sepenuhnya dikendalikan oleh Apple dan diperbarui bersama iOS, sementara Alamofire memerlukan dukungan kompatibilitas dengan versi OS baru dari pengembang pustaka.
Swift modern mendukung async/await, yang membuat permintaan jaringan lebih mudah dibaca dibandingkan dengan closure. Mari kita lihat permintaan GET yang sama menggunakan sintaks asinkron.
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
}
Metode data(from:) tersedia sejak iOS 15 dan macOS 12. Ia mengembalikan tuple (Data, URLResponse) dan melempar kesalahan jika ada masalah jaringan. JSONDecoder dengan model Codable secara otomatis mendeserialisasi respons — ini menggantikan JSONSerialization yang rumit dari contoh sebelumnya.
Untuk permintaan POST dengan body JSON, digunakan URLRequest di mana metode, header Content-Type, dan body permintaan dalam bentuk Data dikonfigurasi. Async/await membuat proses ini ringkas dan jelas, dan penanganan kesalahan sederhana melalui blok 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)
}
Pertanyaan yang Sering Diajukan
URLSession adalah pengganti modern NSURLConnection, diperkenalkan di iOS 7. Perbedaan utama: dukungan untuk banyak koneksi melalui sesi, menjeda dan melanjutkan tugas, unduhan latar belakang, dan WebSocket. NSURLConnection sudah usang dan tidak disarankan untuk digunakan di proyek baru.
Untuk melacak kemajuan, gunakan delegate URLSessionDownloadDelegate dengan metode urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite). Alternatifnya, untuk dataTask dapat berlangganan ke URLSessionTaskDelegate dan menerima pembaruan melalui didSendBodyData.
Unduhan latar belakang dikonfigurasi melalui .background(withIdentifier:). Aplikasi mendaftarkan handler penyelesaian di AppDelegate dan menerima hasil bahkan setelah diminimalkan atau ditutup. Sistem mengelola unduhan dan memberi tahu aplikasi melalui delegate sessionDidFinishEvents.
Ya, sejak iOS 13 URLSession mendukung WebSocket melalui kelas URLSessionWebSocketTask. Ini dibuat dengan metode webSocketTask(with:) dan menyediakan metode send, receive dengan dukungan untuk pesan teks dan biner, serta ping/pong untuk mempertahankan koneksi.
Batas waktu diatur melalui URLSessionConfiguration: properti timeoutIntervalForRequest (menunggu respons permintaan) dan timeoutIntervalForResource (waktu maksimum seluruh unduhan). Default: 60 detik untuk permintaan dan 7 hari untuk sumber daya.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga