URLSession — nedir, ağ API'si ve iOS'ta nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-03-07 Okuma süresi: 8 dk

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 — ağ istekleri, HTTP, dosya indirme ve WebSocket için Apple'ın yerel API'si
  • Görev türleri: dataTask (istekler), downloadTask (indirme), uploadTask (yükleme), webSocketTask
  • Oturum yapılandırması davranışı belirler: önbellekleme, zaman aşımları, proxy'ler, kimlik bilgileri
  • Eşzamansızlık closure'lar, delegeler veya modern async/await aracılığıyla uygulanır
  • Arka plan oturumları uygulama simge durumuna küçültüldüğünde bile veri yüklemeye izin verir

URLSession Nedir?

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

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.

URLSessionConfiguration

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ürleri

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.

URLSession Delegeleti

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 İstek Nasıl Yapılır

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.

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("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 ile Dosya İndirme

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.

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

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.

URLSession vs Alamofire

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.

KriterURLSessionAlamofire
BağımlılıklarYok, Foundation'a dahiliSPM veya CocoaPods gerektirir
SözdizimiClosure'lar ile emir kipiZincirleme ile bildirimsel
JSON İşlemeManuel JSONSerializationCodable ile responseDecodable
YakalayıcılarDelegelet aracılığıylaRequestInterceptor, EventMonitor
İlerlemeDelegelet aracılığıyladownloadProgress, 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.

URLSession Kod Örnekleri

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.

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
}

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 İsteği

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.

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

Sıkça Sorulan Sorular

URLSession, NSURLConnection'dan nasıl farklıdır?

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.

URLSession'da indirme ilerlemesi nasıl izlenir?

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

URLSession ile arka plan indirmesi nasıl yapılır?

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.

URLSession WebSocket ile kullanılabilir mi?

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.

URLSession'da zaman aşımı nasıl ayarlanır?

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

  • URLSession — ağ istekleri için Apple'ın yerel API'si, HTTP, arka plan indirmeleri ve WebSocket desteği
  • Üç yapılandırma türü (.default, .ephemeral, .background) oturum davranışını belirler
  • Dört görev türü tüm senaryoları kapsar: dataTask, downloadTask, uploadTask, webSocketTask
  • Delegelet kimlik doğrulama, ilerleme ve yönlendirmeleri yönetmeye olanak tanır
  • Async/await iOS 15'ten itibaren URLSession kodunu daha okunabilir ve kısa hale getirir
  • URLSession veya Alamofire seçimi proje boyutuna bağlıdır — URLSession basit görevler için yeterlidir

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.

Projeyi tartış

Ayrıca okuyun