URLSession, iOS ve macOS'ta ağ istekleri için bir API'dir, Foundation framework'ünün bir parçası olarak HTTP, HTTPS, arka plan indirmeleri ve WebSocket ile çalışmak için birleşik bir arayüz sağlar. Eski NSURLConnection'ın yerini almış ve Apple geliştiricileri için birincil ağ araçı haline gelmiştir. Apple Developer Documentation (2025)'a göre, URLSession iPhone ve iPad uygulamalarındaki ağ trafiğinin %90'ından fazlasını işler.
Önemli Noktalar
URLSession, Apple tarafından iOS 7 ve macOS 10.9'da tanıtılan ağ işlemleri için bir API'dir. NSURLConnection'ın yerini almış ve ağ ile çalışmak için daha esnek ve güçlü bir model sağlamıştır. Kütüphane, HTTP/1.1, HTTP/2, HTTP/3 ve WebSocket'in yanı sıra veri yüklemek için arka plan oturumlarını da destekler.
URLSession'ın eski NSURLConnection'a göre ana avantajı, tek bir oturum aracılığıyla birden fazla eşzamanlı bağlantı desteği, özelleştirilebilir yapılandırmalar ve indirmeleri duraklatma ve devam ettirme yeteneğidir. Bir oturum, paylaşılan ayarlarla (önbellekleme, çerez politikası, zaman aşımları, TLS sertifikaları) bir ağ görevleri grubunu birleştirir.
iOS'ta URLSession, sistem DNS önbelleği, güç yönetimi ve arka plan işlemleriyle çalışır. Uygulama simge durumuna küçültüldüğünde, sistem arka plan oturumu aracılığıyla veri yüklemeye devam edebilir ve tamamlandığında, bir tamamlama işleyicisi aracılığıyla uygulamayı bildirebilir. Arka plan oturumları, büyük dosyaları indirmek, içeriği güncellemek ve belge ve medya uygulamalarında veri senkronizasyonu için özellikle kullanışlıdır. Arka plan oturumlarıyla çalışmak için URLSessionDelegate'i uygulamanız ve oturum oluştururken bir yapılandırma tanımlayıcısı iletmeniz gerekir — sistem, uygulama yeniden başlatıldıktan sonra oturumu geri yüklemek için bu tanımlayıcıyı kullanır.
URLSession'ın önemli bir avantajı HTTP/2 ve HTTP/3 desteğidir. HTTP/2 çoğullama, tek bir TCP bağlantısı üzerinden birden fazla istek göndermeye izin vererek gecikmeyi ve sunucu yükünü azaltır. UDP üzerinde QUIC protokolüne dayanan HTTP/3, TCP el sıkışmasını ortadan kaldırarak daha da hızlı bağlantı kurulumu sağlar.
URLSession mimarisi üç temel bileşenden oluşur: oturum yapılandırması, oturumun kendisi ve görevler. Her bileşen, ağ etkileşiminin kendi yönünden sorumludur ve bunların kombinasyonu, ağ ile çalışırken uygulamanın davranışını belirler.
Yapılandırma, oturum parametrelerini belirler — zaman aşımlarından önbellekleme politikalarına kadar. Üç tür vardır: .default (disk önbelleği ile standart), .ephemeral (önbellek ve çerezleri kaydetmeden) ve .background (arka plan indirmeleri için). Yapılandırmada, ana bilgisayar başına maksimum bağlantı sayısını, istek ve kaynak zaman aşımını, TLS politikasını ve proxy ayarlarını belirtebilirsiniz.
URLSessionTask, tüm ağ işlemleri için temel sınıftır. Ana alt sınıflar şunlardır: bellekte veri döndüren GET ve POST istekleri için URLSessionDataTask, dosyaları diske indirmek için URLSessionDownloadTask, dosyaları sunucuya yüklemek için URLSessionUploadTask ve iOS 13'ten itibaren WebSocket ile çalışmak için URLSessionWebSocketTask.
Oturum delegeleti, görevlerin ilerlemesiyle ilgili olayları alır: veri alma, indirme tamamlama, kimlik doğrulama hataları, yönlendirmeler. URLSessionDelegate ve alt protokolleri, kimlik doğrulama sırasında TLS sertifikalarını durdurmayı, URLCache aracılığıyla yanıt önbelleğini yönetmeyi ve büyük dosyaların indirme ilerlemesini izlemeyi sağlar. Alternatif olarak, ara olay işlemenin gerekli olmadığı basit durumlar için closure'lar (tamamlama işleyicileri) kullanılabilir.
URLSession ile temel iş akışı şöyledir: bir yapılandırma oluşturun, buna dayalı bir oturum oluşturun, ardından oturum aracılığıyla bir URL isteği ile bir görev oluşturun ve görevi başlatın. Bir closure ile GET isteği örneğini inceleyelim. Bu model, çoğu iOS uygulamasında REST API'lerinden veri almak, görüntüleri yüklemek ve bulut hizmetleriyle etkileşim kurmak için kullanılır.
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("Error: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
Örnek, basit istekler için .default yapılandırmasına sahip bir tekil olan URLSession.shared'i kullanır. dataTask, eşzamansız bir işlem oluşturur ancak başlatmaz — resume() çağrılmalıdır. Closure, istek tamamlandıktan sonra çalışır ve data, response veya error döndürür. Kendi yapılandırmanızla özel bir oturum için, tüm oturum görevleri için önbellekleme politikaları, zaman aşımları, maksimum bağlantılar, varsayılan HTTP başlıkları ve proxy ayarları belirlemenize izin veren URLSession(configuration:) başlatıcısını kullanın. Bu yaklaşım, uygulamanızdaki ağ davranışı üzerinde tam kontrol sağlar.
URLSession, duraklatma ve devam ettirme yeteneği ile dosya indirmelerini ve arka plan indirmelerini destekler. DownloadTask, dosyayı geçici bir dizine kaydeder ve tamamlama closure'ında dosyayı kalıcı bir konuma taşımanız gerekir.
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()
Closure'daki location parametresi, taşınması gereken geçici bir dosyayı işaret eder, aksi takdirde sistem closure'dan çıktıktan sonra dosyayı siler. İlerlemeyi izlemek için, yazılan bayt sayısını ve toplam dosya boyutunu ileten didWriteData yöntemiyle URLSessionDownloadDelegate'i kullanın — bu veriler, kullanıcı arayüzünde bir ilerleme çubuğu görüntülemek için kullanılabilir. downloadTask ile arka plan oturumları, uygulama simge durumuna küçültüldükten sonra bile indirmeye devam etmenizi sağlar ve tamamlandığında sistem, AppDelegate'teki işleyiciyi çağırır.
Alamofire, URLSession üzerine inşa edilmiş ve daha bildirimsel bir arayüz sağlayan bir Swift kütüphanesidir. Yerel API ile Alamofire arasındaki seçim, projenin karmaşıklığına ve ekip tercihlerine bağlıdır.
| Kriter | URLSession | Alamofire |
|---|---|---|
| Bağımlılıklar | Yok, Foundation'a dahili | SPM veya CocoaPods gerektirir |
| Sözdizimi | Closure'lar ile emir kipi | Zincirleme ile bildirimsel |
| JSON İşleme | Manuel JSONSerialization | Codable ile responseDecodable |
| Yakalayıcılar | Delegelet aracılığıyla | RequestInterceptor, EventMonitor |
| İlerleme | Delegelet aracılığıyla | downloadProgress, uploadProgress |
Basit projeler için URLSession yeterlidir ve bağımlılık eklemez. Alamofire, çok sayıda ağ isteği, karmaşık hata işleme ve kısa sözdizimi ihtiyacı olan projelerde haklı çıkar. Her iki teknoloji de ortak URLSessionConfiguration temelini paylaşır ve birbiriyle uyumludur. Seçim yaparken, URLSession'ın tamamen Apple tarafından kontrol edildiğini ve iOS ile güncellendiğini, Alamofire'ın ise kütüphane geliştiricilerinin yeni işletim sistemi sürümleriyle uyumluluğu sürdürmesini gerektirdiğini göz önünde bulundurun.
Modern Swift, async/await'i destekler ve bu, ağ isteklerini closure'lara kıyasla daha okunabilir hale getirir. Aynı GET isteğini eşzamansız sözdizimi kullanarak inceleyelim.
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
}
data(from:) yöntemi iOS 15 ve macOS 12'den itibaren kullanılabilir. Bir demet (Data, URLResponse) döndürür ve ağ sorunlarında hata fırlatır. Codable modeli ile JSONDecoder, yanıtı otomatik olarak seri durumdan çıkarır — bu, önceki örnekteki hantal JSONSerialization'ın yerini alır.
JSON gövdeli POST istekleri için, yöntemi, Content-Type başlıklarını ve istek gövdesini Data olarak yapılandırdığınız URLRequest kullanılır. Async/await bu süreci kısa ve net hale getirir ve hata işleme bir do-catch bloğu aracılığıyla basittir.
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)
}
Sıkça Sorulan Sorular
URLSession, iOS 7'de tanıtılan NSURLConnection'ın modern yerine geçendir. Temel farklılıklar arasında oturumlar aracılığıyla birden fazla bağlantı desteği, görevleri duraklatma ve devam ettirme, arka plan indirmeleri ve WebSocket bulunur. NSURLConnection kullanımdan kaldırılmıştır ve yeni projelerde kullanılması önerilmez.
İlerlemeyi izlemek için, URLSessionDownloadDelegate'i urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) yöntemiyle kullanın. Alternatif olarak, dataTask için URLSessionTaskDelegate'e abone olabilir ve didSendBodyData aracılığıyla güncellemeler alabilirsiniz.
Arka plan indirmeleri, .background(withIdentifier:) yapılandırması aracılığıyla yapılandırılır. Uygulama, AppDelegate'te bir tamamlama işleyicisi kaydeder ve simge durumuna küçültüldükten veya kapatıldıktan sonra bile sonuçları alır. Sistem indirmeyi yönetir ve sessionDidFinishEvents delegeleti aracılığıyla uygulamayı bildirir.
Evet, iOS 13'ten itibaren URLSession, URLSessionWebSocketTask sınıfı aracılığıyla WebSocket'i destekler. webSocketTask(with:) yöntemiyle oluşturulur ve metin ve ikili mesajlar için destek ile send, receive yöntemlerinin yanı sıra bağlantıyı canlı tutmak için ping/pong sağlar.
Zaman aşımları URLSessionConfiguration aracılığıyla yapılandırılır: timeoutIntervalForRequest özelliği (bir isteğe yanıt bekleme) ve timeoutIntervalForResource (tüm indirme için maksimum süre). Varsayılanlar: istek için 60 saniye ve kaynak için 7 gün.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun