URLSession iOS اور macOS میں نیٹ ورک کی درخواستوں کے لیے ایک API ہے، جو Foundation فریم ورک کا حصہ ہے اور HTTP، HTTPS، بیک گراؤنڈ ڈاؤن لوڈ اور WebSocket کے ساتھ کام کرنے کے لیے ایک متحد انٹرفیس فراہم کرتا ہے۔ اس نے پرانے NSURLConnection کی جگہ لے لی اور Apple ڈیولپرز کے لیے بنیادی نیٹ ورکنگ ٹول بن گیا۔ Apple Developer Documentation (2025) کے مطابق، URLSession iPhone اور iPad ایپلیکیشنز میں 90% سے زیادہ نیٹ ورک ٹریفک کو ہینڈل کرتا ہے۔
اہم نکات
URLSession Apple کی طرف سے iOS 7 اور macOS 10.9 میں متعارف کرایا گیا نیٹ ورک آپریشنز کے لیے ایک API ہے۔ اس نے NSURLConnection کی جگہ لی اور نیٹ ورک کے ساتھ کام کرنے کے لیے ایک زیادہ لچکدار اور طاقتور ماڈل فراہم کیا۔ لائبریری HTTP/1.1، HTTP/2، HTTP/3 اور WebSocket کے ساتھ ساتھ ڈیٹا لوڈ کرنے کے لیے بیک گراؤنڈ سیشنز کو سپورٹ کرتی ہے۔
پرانے NSURLConnection پر URLSession کا بنیادی فائدہ ایک ہی سیشن کے ذریعے متعدد بیک وقت کنیکشنز کا سپورٹ، حسب ضرورت کنفیگریشنز اور ڈاؤن لوڈ کو روکنے اور دوبارہ شروع کرنے کی صلاحیت ہے۔ ایک سیشن مشترکہ ترتیبات (کیشنگ، کوکی پالیسی، ٹائم آؤٹ، TLS سرٹیفکیٹ) کے ساتھ نیٹ ورک کے کاموں کے گروپ کو یکجا کرتا ہے۔
iOS میں، URLSession سسٹم DNS کیش، پاور مینجمنٹ اور بیک گراؤنڈ پروسیسز کے ساتھ کام کرتا ہے۔ جب ایپ چھوٹی ہو جاتی ہے، تو سسٹم بیک گراؤنڈ سیشن کے ذریعے ڈیٹا لوڈ کرنا جاری رکھ سکتا ہے اور مکمل ہونے پر، ایک تکمیلی ہینڈلر کے ذریعے ایپ کو مطلع کر سکتا ہے۔ بیک گراؤنڈ سیشنز خاص طور پر بڑی فائلیں ڈاؤن لوڈ کرنے، مواد کو اپ ڈیٹ کرنے اور دستاویزات اور میڈیا ایپلیکیشنز میں ڈیٹا سنکرونائز کرنے کے لیے مفید ہیں۔ بیک گراؤنڈ سیشنز کے ساتھ کام کرنے کے لیے، آپ کو URLSessionDelegate کو لاگو کرنا ہوگا اور سیشن بناتے وقت ایک کنفیگریشن شناخت کنندہ پاس کرنا ہوگا — سسٹم ایپ کے دوبارہ شروع ہونے کے بعد سیشن کو بحال کرنے کے لیے اس شناخت کنندہ کا استعمال کرتا ہے۔
URLSession کا ایک اہم فائدہ HTTP/2 اور HTTP/3 کا سپورٹ ہے۔ HTTP/2 ملٹی پلیکسنگ ایک ہی TCP کنیکشن پر متعدد درخواستیں بھیجنے کی اجازت دیتی ہے، جس سے تاخیر اور سرور کا بوجھ کم ہوتا ہے۔ UDP پر QUIC پروٹوکل پر مبنی HTTP/3، TCP مصافحہ کو ختم کرکے اور بھی تیز تر کنیکشن قیام فراہم کرتا ہے۔
URLSession کا فن تعمیر تین اہم اجزاء پر مشتمل ہے: سیشن کنفیگریشن، خود سیشن، اور کام۔ ہر جزو نیٹ ورک کے تعامل کے ایک پہلو کے لیے ذمہ دار ہے اور ان کا مجموعہ نیٹ ورک کے ساتھ کام کرتے وقت ایپلیکیشن کے رویے کا تعین کرتا ہے۔
کنفیگریشن سیشن کے پیرامیٹرز طے کرتی ہے — ٹائم آؤٹ سے لے کر کیشنگ پالیسیوں تک۔ تین اقسام ہیں: .default (ڈسک کیش کے ساتھ معیاری)، .ephemeral (کیش اور کوکی محفوظ کیے بغیر) اور .background (بیک گراؤنڈ ڈاؤن لوڈ کے لیے)۔ کنفیگریشن میں، آپ فی میزبان زیادہ سے زیادہ کنیکشنز کی تعداد، درخواست اور وسائل کا ٹائم آؤٹ، TLS پالیسی اور پراکسی سیٹنگز بتا سکتے ہیں۔
URLSessionTask تمام نیٹ ورک آپریشنز کے لیے بنیادی کلاس ہے۔ اہم ذیلی کلاسیں یہ ہیں: میموری میں ڈیٹا واپس کرنے والی GET اور POST درخواستوں کے لیے URLSessionDataTask، ڈسک پر فائلیں ڈاؤن لوڈ کرنے کے لیے URLSessionDownloadTask، سرور پر فائلیں اپ لوڈ کرنے کے لیے URLSessionUploadTask اور iOS 13 سے WebSocket کے ساتھ کام کرنے کے لیے URLSessionWebSocketTask۔
سیشن delegate کاموں کی پیشرفت کے بارے میں واقعات وصول کرتا ہے: ڈیٹا وصولی، ڈاؤن لوڈ مکمل ہونا، تصدیق کی غلطیاں، ری ڈائریکٹ۔ URLSessionDelegate اور اس کے ذیلی پروٹوکول تصدیق کے دوران TLS سرٹیفکیٹس کو روکنے، URLCache کے ذریعے جوابی کیشنگ کا انتظام کرنے اور بڑی فائلوں کے ڈاؤن لوڈ کی پیشرفت کی نگرانی کرنے کی اجازت دیتے ہیں۔ متبادل طور پر، سادہ معاملات کے لیے closures (تکمیلی ہینڈلرز) استعمال کیے جا سکتے ہیں جہاں درمیانی واقعہ کی ہینڈلنگ کی ضرورت نہیں ہے۔
URLSession کے ساتھ بنیادی ورک فلو یوں ہے: ایک کنفیگریشن بنائیں، اس کی بنیاد پر ایک سیشن بنائیں، پھر سیشن کے ذریعے URL درخواست کے ساتھ ایک کام بنائیں اور کام شروع کریں۔ آئیے ایک closure کے ساتھ GET درخواست کی مثال دیکھتے ہیں۔ یہ پیٹرن زیادہ تر iOS ایپلیکیشنز میں REST APIs سے ڈیٹا حاصل کرنے، تصاویر لوڈ کرنے اور کلاؤڈ سروسز کے ساتھ تعامل کے لیے استعمال ہوتا ہے۔
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()
مثال سادہ درخواستوں کے لیے .default کنفیگریشن کے ساتھ ایک سنگلٹن URLSession.shared استعمال کرتی ہے۔ dataTask ایک غیر مطابقت پذیر آپریشن بناتا ہے لیکن اسے شروع نہیں کرتا — آپ کو resume() کال کرنا ہوگا۔ درخواست مکمل ہونے کے بعد closure عمل میں آتا ہے اور data، response یا error واپس کرتا ہے۔ اپنی کنفیگریشن کے ساتھ حسب ضرورت سیشن کے لیے، URLSession(configuration:) ابتدائیہ استعمال کریں، جو تمام سیشن کاموں کے لیے کیشنگ پالیسیاں، ٹائم آؤٹ، زیادہ سے زیادہ کنیکشنز، ڈیفالٹ HTTP ہیڈرز اور پراکسی سیٹنگز طے کرنے کی اجازت دیتا ہے۔ یہ طریقہ آپ کو اپنی ایپلیکیشن میں نیٹ ورک کے رویے پر مکمل کنٹرول دیتا ہے۔
URLSession روکنے اور دوبارہ شروع کرنے کی صلاحیت کے ساتھ فائل ڈاؤن لوڈز کے ساتھ ساتھ بیک گراؤنڈ ڈاؤن لوڈز کو سپورٹ کرتا ہے۔ DownloadTask فائل کو عارضی ڈائریکٹری میں محفوظ کرتا ہے اور تکمیلی closure میں آپ کو اسے مستقل مقام پر منتقل کرنا ہوگا۔
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 میں location پیرامیٹر ایک عارضی فائل کی طرف اشارہ کرتا ہے جسے منتقل کرنے کی ضرورت ہے، ورنہ سسٹم closure سے باہر نکلنے کے بعد اسے حذف کر دے گا۔ پیشرفت کو ٹریک کرنے کے لیے، URLSessionDownloadDelegate کو didWriteData طریقہ کے ساتھ استعمال کریں، جو لکھے گئے بائٹس کی تعداد اور کل فائل سائز فراہم کرتا ہے — یہ ڈیٹا صارف انٹرفیس میں پیشرفت بار ظاہر کرنے کے لیے استعمال کیا جا سکتا ہے۔ downloadTask کے ساتھ بیک گراؤنڈ سیشنز ایپ کے چھوٹا ہونے کے بعد بھی ڈاؤن لوڈ جاری رکھنے کی اجازت دیتے ہیں اور مکمل ہونے پر، سسٹم AppDelegate میں ہینڈلر کو کال کرتا ہے۔
Alamofire ایک Swift لائبریری ہے جو URLSession کے اوپر بنائی گئی ہے اور ایک زیادہ اعلانیہ انٹرفیس فراہم کرتی ہے۔ مقامی API اور Alamofire کے درمیان انتخاب پروجیکٹ کی پیچیدگی اور ٹیم کی ترجیحات پر منحصر ہے۔
| معیار | URLSession | Alamofire |
|---|---|---|
| انحصار | کوئی نہیں، Foundation میں شامل | SPM یا CocoaPods درکار |
| نحو | closures کے ساتھ لازمی | زنجیر کے ساتھ اعلانیہ |
| JSON ہینڈلنگ | دستی JSONSerialization | Codable کے ساتھ responseDecodable |
| انٹرسیپٹرز | delegate کے ذریعے | RequestInterceptor, EventMonitor |
| پیشرفت | delegate کے ذریعے | downloadProgress, uploadProgress |
سادہ پروجیکٹس کے لیے، URLSession کافی ہے اور کوئی انحصار شامل نہیں کرتا۔ Alamofire ان پروجیکٹس میں جائز ہے جن میں بہت زیادہ نیٹ ورک درخواستیں، پیچیدہ غلطی کا انتظام اور مختصر نحو کی ضرورت ہوتی ہے۔ دونوں ٹیکنالوجیز مشترکہ URLSessionConfiguration بنیاد رکھتی ہیں اور ایک دوسرے کے ساتھ مطابقت رکھتی ہیں۔ انتخاب کرتے وقت، غور کریں کہ URLSession مکمل طور پر Apple کے کنٹرول میں ہے اور iOS کے ساتھ اپ ڈیٹ ہوتی ہے، جبکہ Alamofire کو لائبریری ڈیولپرز کو نئے OS ورژنز کے ساتھ مطابقت برقرار رکھنے کی ضرورت ہوتی ہے۔
جدید Swift async/await کو سپورٹ کرتا ہے، جو closures کے مقابلے میں نیٹ ورک کی درخواستوں کو زیادہ پڑھنے کے قابل بناتا ہے۔ آئیے اسی GET درخواست کو غیر مطابقت پذیر نحو کا استعمال کرتے ہوئے دیکھتے ہیں۔
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:) طریقہ iOS 15 اور macOS 12 سے دستیاب ہے۔ یہ ایک ٹیپل (Data, URLResponse) واپس کرتا ہے اور نیٹ ورک کے مسائل پر خرابی پھینکتا ہے۔ Codable ماڈل کے ساتھ JSONDecoder خود بخود جواب کو ڈی سیریلائز کرتا ہے — یہ پچھلی مثال کے بوجھل JSONSerialization کی جگہ لیتا ہے۔
JSON باڈی کے ساتھ POST درخواستوں کے لیے، URLRequest استعمال کیا جاتا ہے، جہاں آپ طریقہ، Content-Type ہیڈرز اور Data کے طور پر درخواست کی باڈی کنفیگر کرتے ہیں۔ Async/await اس عمل کو مختصر اور واضح بناتا ہے اور 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)
}
اکثر پوچھے گئے سوالات
URLSession NSURLConnection کا جدید متبادل ہے، جو iOS 7 میں متعارف کرایا گیا تھا۔ اہم فرقوں میں سیشنز کے ذریعے متعدد کنیکشنز کا سپورٹ، کاموں کو روکنا اور دوبارہ شروع کرنا، بیک گراؤنڈ ڈاؤن لوڈ اور WebSocket شامل ہیں۔ NSURLConnection فرسودہ ہے اور نئے پروجیکٹس میں استعمال کے لیے تجویز نہیں کیا جاتا۔
پیشرفت کو ٹریک کرنے کے لیے، URLSessionDownloadDelegate کو urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite) طریقہ کے ساتھ استعمال کریں۔ متبادل طور پر، dataTask کے لیے آپ URLSessionTaskDelegate کو سبسکرائب کر سکتے ہیں اور didSendBodyData کے ذریعے اپ ڈیٹس حاصل کر سکتے ہیں۔
بیک گراؤنڈ ڈاؤن لوڈ .background(withIdentifier:) کنفیگریشن کے ذریعے کنفیگر کیے جاتے ہیں۔ ایپ AppDelegate میں ایک تکمیلی ہینڈلر رجسٹر کرتی ہے اور چھوٹا یا بند ہونے کے بعد بھی نتائج حاصل کرتی ہے۔ سسٹم ڈاؤن لوڈ کا انتظام کرتا ہے اور sessionDidFinishEvents delegate کے ذریعے ایپ کو مطلع کرتا ہے۔
ہاں، iOS 13 سے URLSession URLSessionWebSocketTask کلاس کے ذریعے WebSocket کو سپورٹ کرتا ہے۔ یہ webSocketTask(with:) طریقہ سے بنایا جاتا ہے اور ٹیکسٹ اور بائنری پیغامات کے سپورٹ کے ساتھ send، receive طریقے فراہم کرتا ہے، نیز کنیکشن کو برقرار رکھنے کے لیے ping/pong فراہم کرتا ہے۔
ٹائم آؤٹ URLSessionConfiguration کے ذریعے کنفیگر کیے جاتے ہیں: timeoutIntervalForRequest پراپرٹی (درخواست کے جواب کا انتظار) اور timeoutIntervalForResource (پورے ڈاؤن لوڈ کا زیادہ سے زیادہ وقت)۔ ڈیفالٹ: درخواست کے لیے 60 سیکنڈ اور وسائل کے لیے 7 دن۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں