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 সংযোগের মাধ্যমে একাধিক অনুরোধ পাঠানোর অনুমতি দেয়, যা লেটেন্সি এবং সার্ভার লোড কমায়। HTTP/3, UDP-র উপরে QUIC প্রোটোকলের উপর ভিত্তি করে, TCP হ্যান্ডশেক বাদ দিয়ে আরও দ্রুত সংযোগ স্থাপন প্রদান করে।
URLSession আর্কিটেকচার তিনটি মূল উপাদান নিয়ে গঠিত: সেশন কনফিগারেশন, সেশন নিজেই এবং টাস্ক। প্রতিটি উপাদান নেটওয়ার্ক মিথস্ক্রিয়ার নিজস্ব দিকের জন্য দায়ী এবং তাদের সংমিশ্রণ নেটওয়ার্কের সাথে কাজ করার সময় অ্যাপ্লিকেশনের আচরণ নির্ধারণ করে।
কনফিগারেশন সেশন প্যারামিটার সেট করে — টাইমআউট থেকে ক্যাশিং নীতি পর্যন্ত। তিনটি ধরন রয়েছে: .default (ডিস্ক ক্যাশ সহ স্ট্যান্ডার্ড), .ephemeral (ক্যাশ এবং কুকি সংরক্ষণ না করে) এবং .background (ব্যাকগ্রাউন্ড ডাউনলোডের জন্য)। কনফিগারেশনে আপনি প্রতি হোস্ট সর্বাধিক সংযোগ সংখ্যা, অনুরোধ এবং রিসোর্স টাইমআউট, TLS নীতি এবং প্রক্সি সেটিংস নির্দিষ্ট করতে পারেন।
URLSessionTask হল সমস্ত নেটওয়ার্ক অপারেশনের জন্য বেস ক্লাস। প্রধান সাবক্লাসগুলি হল: URLSessionDataTask মেমোরিতে ডেটা ফেরত দেওয়া GET এবং POST অনুরোধের জন্য, URLSessionDownloadTask ডিস্কে ফাইল ডাউনলোড করার জন্য, URLSessionUploadTask সার্ভারে ফাইল আপলোড করার জন্য এবং URLSessionWebSocketTask iOS 13 থেকে WebSocket-এর সাথে কাজ করার জন্য।
সেশন ডেলিগেট টাস্কের অগ্রগতি সম্পর্কে ইভেন্ট পায়: ডেটা প্রাপ্তি, ডাউনলোড সম্পূর্ণ, প্রমাণীকরণ ত্রুটি, রিডাইরেক্ট। URLSessionDelegate এবং এর সাব-প্রোটোকলগুলি প্রমাণীকরণের সময় TLS সার্টিফিকেট ইন্টারসেপ্ট, URLCache-এর মাধ্যমে রেসপন্স ক্যাশিং পরিচালনা এবং বড় ফাইলের ডাউনলোড অগ্রগতি পর্যবেক্ষণের অনুমতি দেয়। বিকল্পভাবে, সাধারণ ক্ষেত্রে ক্লোজার (কমপ্লিশন হ্যান্ডলার) ব্যবহার করা যেতে পারে যেখানে মধ্যবর্তী ইভেন্ট হ্যান্ডলিং প্রয়োজন নেই।
URLSession-এর সাথে মৌলিক ওয়ার্কফ্লো এইরকম: একটি কনফিগারেশন তৈরি করুন, তার ভিত্তিতে একটি সেশন তৈরি করুন, তারপর সেশনের মাধ্যমে URL অনুরোধ সহ একটি টাস্ক তৈরি করুন এবং টাস্ক শুরু করুন। আসুন একটি ক্লোজার সহ 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()
উদাহরণটি URLSession.shared ব্যবহার করে — সাধারণ অনুরোধের জন্য .default কনফিগারেশন সহ একটি সিংগলটন। dataTask একটি অ্যাসিনক্রোনাস অপারেশন তৈরি করে কিন্তু এটি শুরু করে না — আপনাকে resume() কল করতে হবে। অনুরোধ সম্পূর্ণ হওয়ার পরে ক্লোজারটি ফায়ার করে এবং data, response বা error ফেরত দেয়। আপনার নিজস্ব কনফিগারেশন সহ কাস্টম সেশনের জন্য, URLSession(configuration:) ইনিশিয়ালাইজার ব্যবহার করুন, যা সমস্ত সেশন টাস্কের জন্য ক্যাশিং নীতি, টাইমআউট, সর্বাধিক সংযোগ, ডিফল্ট HTTP হেডার এবং প্রক্সি সেটিংস সেট করার অনুমতি দেয়। এই পদ্ধতি আপনাকে আপনার অ্যাপ্লিকেশনে নেটওয়ার্ক আচরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়।
URLSession ফাইল ডাউনলোড বিরাম এবং পুনরায় শুরু করার ক্ষমতা সহ, পাশাপাশি ব্যাকগ্রাউন্ড ডাউনলোড সমর্থন করে। DownloadTask ফাইলটি একটি অস্থায়ী ডিরেক্টরিতে সংরক্ষণ করে এবং কমপ্লিশন ক্লোজারে আপনাকে এটি একটি স্থায়ী অবস্থানে সরাতে হবে।
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()
ক্লোজারের location প্যারামিটারটি একটি অস্থায়ী ফাইল নির্দেশ করে যা সরানো প্রয়োজন, অন্যথায় ক্লোজার থেকে বের হওয়ার পরে সিস্টেম এটি মুছে ফেলবে। অগ্রগতি ট্র্যাক করতে, URLSessionDownloadDelegate ব্যবহার করুন didWriteData পদ্ধতির সাথে, যা লেখা বাইটের সংখ্যা এবং মোট ফাইলের আকার পাস করে — এই ডেটা ইউজার ইন্টারফেসে একটি প্রোগ্রেস বার প্রদর্শন করতে ব্যবহার করা যেতে পারে। downloadTask সহ ব্যাকগ্রাউন্ড সেশন অ্যাপ মিনিমাইজ করার পরেও ডাউনলোড চালিয়ে যাওয়ার অনুমতি দেয় এবং সম্পূর্ণ হলে সিস্টেম AppDelegate-এ হ্যান্ডলার কল করে।
Alamofire হল একটি Swift লাইব্রেরি যা URLSession-এর উপরে নির্মিত এবং আরও ঘোষণামূলক ইন্টারফেস প্রদান করে। নেটিভ API এবং Alamofire-এর মধ্যে পছন্দ প্রকল্পের জটিলতা এবং দলের পছন্দের উপর নির্ভর করে।
| মাপকাঠি | URLSession | Alamofire |
|---|---|---|
| নির্ভরতা | কোনটিই নয়, Foundation-এ অন্তর্নির্মিত | SPM বা CocoaPods প্রয়োজন |
| সিনট্যাক্স | ক্লোজার সহ আবশ্যিক | শৃঙ্খলন সহ ঘোষণামূলক |
| JSON হ্যান্ডলিং | ম্যানুয়াল JSONSerialization | Codable সহ responseDecodable |
| ইন্টারসেপ্টর | ডেলিগেটের মাধ্যমে | RequestInterceptor, EventMonitor |
| অগ্রগতি | ডেলিগেটের মাধ্যমে | downloadProgress, uploadProgress |
সাধারণ প্রকল্পের জন্য, URLSession যথেষ্ট এবং কোনো নির্ভরতা যোগ করে না। Alamofire অনেক নেটওয়ার্ক অনুরোধ, জটিল ত্রুটি হ্যান্ডলিং এবং সংক্ষিপ্ত সিনট্যাক্সের প্রয়োজন এমন প্রকল্পে ন্যায়সঙ্গত। উভয় প্রযুক্তি সাধারণ URLSessionConfiguration ভিত্তি ভাগ করে এবং একে অপরের সাথে সামঞ্জস্যপূর্ণ। নির্বাচন করার সময়, বিবেচনা করুন যে URLSession সম্পূর্ণরূপে Apple দ্বারা নিয়ন্ত্রিত এবং iOS-এর সাথে আপডেট হয়, যখন Alamofire-এর জন্য লাইব্রেরি ডেভেলপারদের নতুন OS সংস্করণের সাথে সামঞ্জস্য বজায় রাখা প্রয়োজন।
আধুনিক Swift async/await সমর্থন করে, যা ক্লোজারের তুলনায় নেটওয়ার্ক অনুরোধকে আরও পঠনযোগ্য করে তোলে। আসুন অ্যাসিনক্রোনাস সিনট্যাক্স ব্যবহার করে একই 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 ডেলিগেটের মাধ্যমে অ্যাপকে জানায়।
হ্যাঁ, iOS 13 থেকে URLSession URLSessionWebSocketTask ক্লাসের মাধ্যমে WebSocket সমর্থন করে। এটি webSocketTask(with:) পদ্ধতি দিয়ে তৈরি করা হয় এবং টেক্সট ও বাইনারি বার্তার সমর্থন সহ send, receive পদ্ধতি প্রদান করে, পাশাপাশি সংযোগ সক্রিয় রাখতে ping/pong প্রদান করে।
URLSessionConfiguration-এর মাধ্যমে টাইমআউট কনফিগার করা হয়: timeoutIntervalForRequest প্রপার্টি (অনুরোধের উত্তরের জন্য অপেক্ষা) এবং timeoutIntervalForResource (সম্পূর্ণ ডাউনলোডের সর্বাধিক সময়)। ডিফল্ট: অনুরোধের জন্য 60 সেকেন্ড এবং রিসোর্সের জন্য 7 দিন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন