URLSession — iOS və macOS-da şəbəkə sorğuları üçün API-dir, Foundation framework-un tərkib hissəsidir və HTTP, HTTPS, fon yükləmə və WebSocket ilə iş üçün vahid interfeys təqdim edir. O, köhnəlmiş NSURLConnection-u əvəz etdi və Apple tərtibatçıları üçün əsas şəbəkə alətinə çevrildi. Apple Developer Documentation (2025) məlumatına görə, URLSession iPhone və iPad tətbiqlərində şəbəkə trafikinin 90%-dən çoxunu emal edir.
Əsas məqamlar
URLSession — Apple tərəfindən iOS 7 və macOS 10.9-da təqdim edilmiş şəbəkə əməliyyatları üçün API-dir. O, NSURLConnection-u əvəz etdi və şəbəkə ilə iş üçün daha çevik və güclü model təmin etdi. Kitabxana HTTP/1.1, HTTP/2, HTTP/3 və WebSocket-i, həmçinin məlumat yükləmə üçün fon sessiyalarını dəstəkləyir.
URLSession-ın köhnə NSURLConnection-dan əsas üstünlüyü — vahid sessiya vasitəsilə çoxlu eynivaxtlı bağlantıları dəstəkləməsi, fərdiləşdirilə bilən konfiqurasiyalar və yükləmələri dayandırıb davam etdirmə imkanıdır. Sessiya ümumi parametrlərə malik şəbəkə tapşırıqları qrupunu birləşdirir: keşləmə, cookie siyasəti, vaxt aşımları, TLS sertifikatları.
iOS-da URLSession sistem DNS keşi, enerji idarəetməsi və fon prosesləri ilə işləyir. Tətbiq kiçildildikdə sistem fon sessiyası vasitəsilə məlumat yükləməyə davam edə bilər və tamamlandıqdan sonra tətbiqi tamamlama handler-i vasitəsilə xəbərdar edir. Fon sessiyaları böyük faylların yüklənməsi, məzmun yenilənməsi və sənəd və media faylları ilə iş tətbiqlərində məlumat sinxronizasiyası üçün xüsusilə faydalıdır. Fon sessiyaları ilə işləmək üçün URLSessionDelegate-i tətbiq etmək və sessiya yaradılarkən konfiqurasiya identifikatorunu ötürmək lazımdır — sistem bu identifikatordan tətbiq yenidən başladıldıqdan sonra sessiyanı bərpa etmək üçün istifadə edir.
URLSession-ın mühüm üstünlüyü HTTP/2 və HTTP/3 dəstəyidir. HTTP/2 multipleksasiyası bir TCP bağlantısı üzərindən çoxlu sorğu göndərməyə imkan verir ki, bu da gecikmələri və server yükünü azaldır. UDP üzərində QUIC protokoluna əsaslanan HTTP/3, TCP əl sıxmasını aradan qaldıraraq daha sürətli bağlantı qurulmasını təmin edir.
URLSession arxitekturası üç əsas komponentdən ibarətdir: sessiya konfiqurasiyası, sessiyanın özü və tapşırıqlar (tasks). Hər bir komponent şəbəkə qarşılıqlı əlaqəsinin öz aspektinə cavabdehdir və onların kombinasiyası tətbiqin şəbəkə ilə iş zamanı davranışını müəyyən edir.
Konfiqurasiya sessiyanın parametrlərini müəyyən edir — vaxt aşımlarından keşləmə siyasətlərinə qədər. Üç növ var: .default (disklə keşləmə ilə standart), .ephemeral (keş və cookie saxlamadan) və .background (fon yükləmə üçün). Konfiqurasiyada host üzrə maksimal bağlantı sayı, sorğu və resurs vaxt aşımı, TLS siyasəti və proksi təyin edilə bilər.
URLSessionTask — bütün şəbəkə əməliyyatları üçün əsas sinifdir. Əsas alt siniflər: GET və POST sorğuları üçün yaddaşda məlumat qaytaran URLSessionDataTask, faylları diskə endirmək üçün URLSessionDownloadTask, faylları serverə göndərmək üçün URLSessionUploadTask və iOS 13-dən etibarən WebSocket ilə iş üçün URLSessionWebSocketTask.
Sessiya delegatı tapşırıqların gedişi haqqında hadisələr alır: məlumatların alınması, yükləmənin tamamlanması, autentifikasiya xətaları, yönləndirmələr. URLSessionDelegate və onun alt protokolları autentifikasiya zamanı TLS sertifikatlarını ələ keçirməyə, URLCache vasitəsilə cavab keşləməni idarə etməyə və böyük faylların yüklənməsinin gedişatını izləməyə imkan verir. Alternativ olaraq, aralıq hadisələrin işlənməsi tələb olunmayan sadə hallarda closure-lardan (completion handlers) istifadə etmək olar.
URLSession ilə işin əsas ssenarisi belədir: konfiqurasiya yaradılır, onun əsasında sessiya, sonra sessiya vasitəsilə URL sorğusu ilə tapşırıq yaradılır və tapşırıq işə salınır. Closure ilə GET sorğusu nümunəsinə baxaq. Bu nümunə əksər iOS tətbiqlərində REST API-dən məlumat almaq, şəkillər yükləmək və bulud xidmətləri ilə qarşılıqlı əlaqə üçün istifadə olunur.
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("Xəta: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
Nümunədə URLSession.shared istifadə olunur — sadə sorğular üçün .default konfiqurasiyası olan sinqleton. dataTask asinxron əməliyyat yaradır, lakin onu işə salmır — mütləq resume() çağırılmalıdır. Closure sorğu tamamlandıqdan sonra işə düşür və data, response və ya error qaytarır. Öz konfiqurasiyası ilə fərdi sessiya üçün URLSession(configuration:) inizializatorundan istifadə edin, bu, keşləmə siyasətlərini, vaxt aşımlarını, maksimal bağlantı sayını, standart HTTP başlıqlarını və sessiyanın bütün tapşırıqları üçün proksi parametrlərini təyin etməyə imkan verir. Bu yanaşma tətbiqdə şəbəkə davranışı üzərində tam nəzarət verir.
URLSession dayandırma və davam etdirmə imkanı ilə fayl yükləməni, həmçinin fon yükləməsini dəstəkləyir. DownloadTask faylı müvəqqəti kataloqa yadda saxlayır və completion closure-da onu daimi yerə köçürmək lazımdır.
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-dakı location parametri köçürülməli olan müvəqqəti faylı göstərir, əks halda sistem closure-dan çıxdıqdan sonra onu siləcək. Gedişatı izləmək üçün yazılmış baytların sayını və faylın ümumi ölçüsünü ötürən didWriteData metodu ilə URLSessionDownloadDelegate delegatından istifadə olunur — bu məlumatlar istifadəçi interfeysində gedişat çubuğu göstərmək üçün istifadə edilə bilər. Fon sessiyaları downloadTask ilə tətbiq kiçildildikdən sonra da yükləməni davam etdirməyə imkan verir və tamamlandıqda sistem AppDelegate-də handler-i çağırır.
Alamofire — URLSession üzərində qurulmuş və daha deklarativ interfeys təmin edən Swift kitabxanasıdır. Doğma API ilə Alamofire arasında seçim layihənin mürəkkəbliyindən və komandanın üstünlüklərindən asılıdır.
| Meyar | URLSession | Alamofire |
|---|---|---|
| Asılılıqlar | Yox, Foundation-a daxildir | SPM və ya CocoaPods tələb edir |
| Sintaksis | Closure-larla imperativ | Zəncirlərlə deklarativ |
| JSON emalı | JSONSerialization əl ilə | responseDecodable ilə Codable |
| Interceptorlar | Delegatlar vasitəsilə | RequestInterceptor, EventMonitor |
| Gedişat | Delegat vasitəsilə | downloadProgress, uploadProgress |
Sadə layihələr üçün URLSession kifayətdir və asılılıq əlavə etmir. Alamofire çoxsaylı şəbəkə sorğuları, mürəkkəb xəta idarəetməsi və yığcam sintaksis tələb edən layihələrdə əsaslandırılır. Hər iki texnologiya ümumi URLSessionConfiguration təməlindən istifadə edir və bir-biri ilə uyğundur. Seçərkən nəzərə almaq lazımdır ki, URLSession tamamilə Apple tərəfindən idarə olunur və iOS ilə birlikdə yenilənir, Alamofire isə kitabxana tərtibatçıları tərəfindən yeni OS versiyaları ilə uyğunluq dəstəyi tələb edir.
Müasir Swift async/await-i dəstəkləyir ki, bu da şəbəkə sorğularını closure-larla müqayisədə daha oxunaqlı edir. Eyni GET sorğusunu asinxron sintaksis ilə nəzərdən keçirək.
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:) metodu iOS 15 və macOS 12-dən etibarən mövcuddur. O, (Data, URLResponse) kortejini qaytarır və şəbəkə problemləri olduqda xəta atır. Codable modeli ilə JSONDecoder avtomatik olaraq cavabı deserializasiya edir — bu, əvvəlki nümunədəki həcmli JSONSerialization-ı əvəz edir.
JSON gövdəsi ilə POST sorğuları üçün metod, Content-Type başlıqları və Data formatında sorğu gövdəsi konfiqurasiya edilən URLRequest istifadə olunur. Async/await bu prosesi yığcam və aydın edir, xəta idarəetməsi isə do-catch bloku vasitəsilə sadədir.
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)
}
Tez-tez verilən suallar
URLSession — iOS 7-də təqdim edilmiş NSURLConnection-un müasir əvəzedicisidir. Əsas fərqlər: sessiyalar vasitəsilə çoxlu bağlantı dəstəyi, tapşırıqların dayandırılması və davam etdirilməsi, fon yükləməsi və WebSocket. NSURLConnection köhnəlmişdir və yeni layihələrdə istifadəsi tövsiyə edilmir.
Gedişatı izləmək üçün urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) metodu ilə URLSessionDownloadDelegate delegatından istifadə olunur. Alternativ olaraq dataTask üçün URLSessionTaskDelegate-ə abunə olmaq və didSendBodyData vasitəsilə yenilikləri almaq olar.
Fon yükləməsi .background(withIdentifier:) konfiqurasiyası vasitəsilə qurulur. Tətbiq AppDelegate-də tamamlama handler-i qeydiyyatdan keçirir və nəticələri kiçildilmə və ya bağlanmadan sonra da alır. Sistem yükləməni idarə edir və tətbiqə sessionDidFinishEvents delegatı vasitəsilə xəbərdarlıq edir.
Bəli, iOS 13-dən etibarən URLSession URLSessionWebSocketTask sinfi vasitəsilə WebSocket-i dəstəkləyir. O, webSocketTask(with:) metodu ilə yaradılır və mətn və ikili mesajları dəstəkləyən send, receive metodlarını, həmçinin bağlantını saxlamaq üçün ping/pong təqdim edir.
Vaxt aşımları URLSessionConfiguration vasitəsilə konfiqurasiya edilir: timeoutIntervalForRequest (cavab gözləmə müddəti) və timeoutIntervalForResource (bütün yükləmənin maksimum vaxtı). Standart olaraq: sorğu üçün 60 saniyə və resurs üçün 7 gün.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun