Background Task একটি iOS মেকানিজম যা অ্যাপ্লিকেশনকে ব্যাকগ্রাউন্ডে চলে যাওয়ার পর একটি অপারেশন সম্পূর্ণ করার অনুমতি দেয়। সিস্টেম কাজটি সম্পাদনের জন্য সীমিত সময় (30 সেকেন্ড পর্যন্ত) বরাদ্দ করে, যার পরে অ্যাপ্লিকেশনটি জোর করে স্থগিত করা হয়। Apple, 2026-এর মতে, ব্যাকগ্রাউন্ড টাস্ক সঠিকভাবে সম্পূর্ণ করার জন্য এক্সপিরেশন হ্যান্ডলার ব্যবহার করা বাধ্যতামূলক প্রয়োজন।
মূল বিষয়
Background Task একটি প্রোগ্রামেটিক iOS মেকানিজম যা অ্যাপ্লিকেশনকে ব্যাকগ্রাউন্ডে চলে যাওয়ার পর নির্বাহের সময় বাড়ানোর অনুমতি দেয়। যখন ব্যবহারকারী অ্যাপ্লিকেশনটি ছোট করে, সিস্টেম UIApplicationDelegate.applicationDidEnterBackground কল করে। যদি সেই মুহূর্তে একটি গুরুত্বপূর্ণ অপারেশন চলমান থাকে (ডেটা সংরক্ষণ, অনুরোধ পাঠানো), অ্যাপ্লিকেশন beginBackgroundTask-এর মাধ্যমে অতিরিক্ত সময় অনুরোধ করতে পারে।
Background Task ব্যবহার না করে, অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে যাওয়ার 3–5 সেকেন্ডের মধ্যে জোর করে স্থগিত করা হয়। সমস্ত অসম্পূর্ণ অপারেশন বাধাগ্রস্ত হয়: ডেটা সংরক্ষিত হয় না, নেটওয়ার্ক অনুরোধ বাতিল হয়, অবস্থা হারিয়ে যায়। Background Task অ্যাপ্লিকেশনকে এই অপারেশনগুলি সঠিকভাবে সম্পূর্ণ করতে 30 সেকেন্ড পর্যন্ত সময় দেয়।
beginBackgroundTask iOS 4.0-তে আবির্ভূত হয় — মাল্টিটাস্কিং সমর্থনকারী প্রথম রিলিজ। iOS 4-এর আগে, হোম বাটন চাপলে অ্যাপ্লিকেশন সম্পূর্ণরূপে শেষ হয়ে যেত। iOS 7 Background Fetch এবং URLSession ব্যাকগ্রাউন্ড কনফিগারেশন প্রবর্তন করে। iOS 13 থেকে শুরু করে, Apple নতুন প্রকল্পের জন্য BGTaskScheduler সুপারিশ করে, কিন্তু beginBackgroundTask স্বল্পমেয়াদী অপারেশনের জন্য প্রাসঙ্গিক থাকে।
beginBackgroundTask UIApplication-এর একটি পদ্ধতি যা একটি কাজ নিবন্ধন করে এবং একটি অনন্য UIBackgroundTaskIdentifier ফেরত দেয়। সিস্টেম ব্যাকগ্রাউন্ড নির্বাহ টাইমার বাড়ায়। সময় শেষ হলে এক্সপিরেশন হ্যান্ডলার কল করা হয়, যার পরে অ্যাপ্লিকেশনকে সঠিকভাবে কাজ সম্পূর্ণ করতে endBackgroundTask(identifier:) কল করতে হবে।
ধাপ 1 — অ্যাপ্লিকেশন didEnterBackground বিজ্ঞপ্তি পায়। ধাপ 2 — beginBackgroundTask(expirationHandler:) কল করা হয়। ধাপ 3 — গুরুত্বপূর্ণ অপারেশন (সংরক্ষণ, নেটওয়ার্ক অনুরোধ) সম্পাদিত হয়। ধাপ 4 — সম্পন্ন হলে, endBackgroundTask(identifier:) কল করা হয়। যদি অপারেশন 30 সেকেন্ডের মধ্যে সম্পন্ন না হয় — সিস্টেম এক্সপিরেশন হ্যান্ডলার কল করে, এবং অ্যাপ্লিকেশনকে অবিলম্বে কাজ শেষ করতে হবে।
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
func startBackgroundTask() {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// এক্সপিরেশন হ্যান্ডলার
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
}
func finishBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
backgroundTimeRemaining প্রপার্টি ব্যাকগ্রাউন্ড টাস্ক জোর করে শেষ হওয়ার আগে বাকি সেকেন্ডের সংখ্যা ফেরত দেয়। মানটি রিয়েল টাইমে হ্রাস পায়। যদি অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে না থাকে — এটি DBL_MAX ফেরত দেয়। আচরণ মানিয়ে নিতে এই প্রপার্টি ব্যবহার করুন: যখন 5 সেকেন্ডের কম বাকি থাকে, দীর্ঘ অপারেশন বাধাগ্রস্ত করুন এবং অগ্রগতি সংরক্ষণ করুন।
একটি অ্যাপ্লিকেশন একসাথে একাধিক Background Tasks নিবন্ধন করতে পারে। প্রতিটি কাজ তার নিজস্ব শনাক্তকারী পায়। মোট নির্বাহ সময় ক্রমবর্ধমান — যদি 3টি কাজ নিবন্ধিত হয়, অ্যাপ্লিকেশন 90 সেকেন্ড পর্যন্ত পেতে পারে। তবে, যদি সম্পদ শেষ হয়ে যায় বা ব্যাটারি সীমা অতিক্রম করে তবে সিস্টেম অ্যাপ্লিকেশনটি আগে শেষ করতে পারে।
এক্সপিরেশন হ্যান্ডলার একটি কোড ব্লক যা সিস্টেম ব্যাকগ্রাউন্ড টাস্কের জন্য বরাদ্দ সময় শেষ হলে কল করে। এক্সপিরেশন হ্যান্ডলার থাকা Apple-এর বাধ্যতামূলক প্রয়োজন। এটি ছাড়া, অ্যাপ্লিকেশন সিস্টেম দ্বারা জোর করে শেষ হতে পারে এবং ডেটা হারিয়ে যেতে পারে।
এক্সপিরেশন হ্যান্ডলারকে অ্যাপ্লিকেশন অবস্থা সংরক্ষণের জন্য ন্যূনতম পদক্ষেপ নিতে হবে: বর্তমান ডেটা স্থায়ী সঞ্চয়ে সংরক্ষণ করুন, সংশ্লিষ্ট শনাক্তকারীর সাথে endBackgroundTask কল করুন এবং শনাক্তকারী .invalid-এ সেট করুন। এক্সপিরেশন হ্যান্ডলারের ভিতরে নতুন দীর্ঘ অপারেশন শুরু করা নিষিদ্ধ — নির্বাহ সময় 1–2 সেকেন্ডের মধ্যে সীমাবদ্ধ।
func handleExpiration() {
// নির্বাহ অগ্রগতি সংরক্ষণ করা হচ্ছে
saveProgressToUserDefaults()
// সক্রিয় নেটওয়ার্ক অনুরোধ বাতিল করা হচ্ছে
currentTask?.cancel()
// Background Task শেষ করা হচ্ছে
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// এক্সপিরেশন হ্যান্ডলার দিয়ে নিবন্ধন
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
withName: "SaveDocument",
expirationHandler: handleExpiration
)
সবচেয়ে সাধারণ ভুল হল এক্সপিরেশন হ্যান্ডলারের ভিতরে endBackgroundTask কল না করা। এই ক্ষেত্রে, সিস্টেম কাজটিকে সক্রিয় মনে করতে থাকে, অ্যাপ্লিকেশন স্থগিত অবস্থায় যায় না এবং ব্যাটারি শেষ হয়ে যায়। দ্বিতীয় ভুল হল এক্সপিরেশন হ্যান্ডলারের ভিতরে দীর্ঘ অপারেশন শুরু করা। সিস্টেম সেগুলি শেষ হওয়ার আগে অ্যাপ্লিকেশনটি শেষ করতে পারে এবং ডেটা হারিয়ে যাবে।
এক্সপিরেশন হ্যান্ডলারে, নির্বাহ সময় গুরুতরভাবে সীমিত — সাধারণত 1 সেকেন্ডের কম। তাই, হ্যান্ডলারের ভিতরে আপনি করতে পারবেন না: জটিল গণনা, নেটওয়ার্ক অনুরোধ, CoreData-তে大量 ডেটা লেখা। শুধুমাত্র পারমাণবিক অপারেশন: UserDefaults-এ একটি কী লেখা, অবস্থা ফ্ল্যাগ সেট করা, endBackgroundTask কল করা।
অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে গেলে একটি ডকুমেন্ট সংরক্ষণের জন্য সম্পূর্ণ Background Task বাস্তবায়ন দেখি। উদাহরণটিতে কাজ নিবন্ধন, অবশিষ্ট সময় পরীক্ষার সাথে অপারেশন সম্পাদন এবং endBackgroundTask-এর মাধ্যমে সঠিক সমাপ্তি অন্তর্ভুক্ত রয়েছে।
ব্যাকগ্রাউন্ডে যাওয়ার সময়, অ্যাপ্লিকেশন একটি বড় ডকুমেন্ট সংরক্ষণ শুরু করে। Background Task অপারেশনের জন্য 30 সেকেন্ড পর্যন্ত সময় দেয়। সময় শেষ হলে — এক্সপিরেশন হ্যান্ডলার মধ্যবর্তী ফলাফল সংরক্ষণ করে। সংরক্ষণ শেষ হওয়ার পরে, সম্পদ মুক্ত করতে endBackgroundTask কল করা হয়।
class DocumentManager {
private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
func saveDocumentInBackground(document: Document) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
self.saveProgress(document)
self.endBackgroundTask()
}
DispatchQueue.global().async {
document.save()
self.endBackgroundTask()
}
}
private func endBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
}
ব্যাকগ্রাউন্ডে নেটওয়ার্ক অনুরোধ বিশেষ মনোযোগ প্রয়োজন — এক্সপিরেশন হ্যান্ডলার প্রতিক্রিয়া পাওয়ার আগে অনুরোধ বাধাগ্রস্ত করতে পারে। dataTask-সহ URLSession ব্যবহার করুন এবং পাঠানোর আগে backgroundTimeRemaining পরীক্ষা করুন। যদি 5 সেকেন্ডের কম বাকি থাকে — পরবর্তী অ্যাপ জাগরণ পর্যন্ত পাঠানো স্থগিত করুন।
func sendCriticalData(data: Data) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// পুনরায় পাঠানোর জন্য ডেটা সংরক্ষণ করা হচ্ছে
saveForRetry(data)
self.endBackgroundTask()
}
let task = URLSession.shared.dataTask(with: request) { _, _, error in
if error != nil {
saveForRetry(data)
}
self.endBackgroundTask()
}
task.resume()
}
দীর্ঘ অপারেশনের জন্য, UIApplication.shared.backgroundTimeRemaining পর্যবেক্ষণ করুন। যদি মান একটি সীমার নিচে (10 সেকেন্ড) নেমে যায়, বর্তমান অপারেশন বাধাগ্রস্ত করুন এবং মধ্যবর্তী ফলাফল সংরক্ষণ শুরু করুন। এটি এক্সপিরেশন হ্যান্ডলার জোর করে কল করার আগে সঠিক সমাপ্তি নিশ্চিত করে।
Background Task একটি শক্তিশালী মেকানিজম, কিন্তু এর অনুচিত ব্যবহার ব্যাটারি এবং কর্মক্ষমতা সমস্যার কারণ হয়। Apple-এর সুপারিশ এবং সম্প্রদায়ের প্রমাণিত অনুশীলন অনুসরণ করা সাধারণ ভুল এড়াতে এবং স্থিতিশীল অ্যাপ্লিকেশন অপারেশন নিশ্চিত করতে সহায়তা করবে।
Background Task যথাসম্ভব দ্রুত সম্পূর্ণ করুন। ব্যাকগ্রাউন্ড নির্বাহের প্রতিটি সেকেন্ড ব্যাটারি শক্তি খরচ করে। সর্বোত্তম সময় — 5 সেকেন্ডের কম। যদি অপারেশন বেশি সময় নেয় — BGTaskScheduler বা Background Modes ব্যবহার বিবেচনা করুন। প্রকৃত প্রয়োজন ছাড়া beginBackgroundTask কলের মাধ্যমে কৃত্রিমভাবে কাজ বাড়াবেন না।
UIBackgroundTaskIdentifier একটি ক্লাস বা স্ট্রাক্ট প্রপার্টি হিসাবে সংরক্ষণ করুন। এটি কখনও গ্লোবাল ভেরিয়েবল হিসাবে পাস করবেন না — এটি একাধিক কাজের সাথে দ্বন্দ্ব সৃষ্টি করে। দ্বৈত সমাপ্তি রোধ করতে endBackgroundTask কল করার পরে শনাক্তকারী .invalid-এ সেট করুন।
Xcode সিমুলেটরে, হোম বাটনের মাধ্যমে অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে সুইচ করুন (Command + Shift + H). ব্যাকগ্রাউন্ড জাগরণ পরীক্ষার জন্য Debug — Simulate Background Fetch ব্যবহার করুন। সময় শেষ হওয়ার অনুকরণ করতে, এনভায়রনমেন্ট ভেরিয়েবল BACKGROUND_TASK_SIMULATE_EXPIRATION = YES সেট করুন — এক্সপিরেশন হ্যান্ডলার 5 সেকেন্ডের মধ্যে কল হবে।
// অপারেশন শুরুর আগে অবশিষ্ট সময় পরীক্ষা
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
// পর্যাপ্ত সময় নেই — কাজ স্থগিত করুন
scheduleForNextLaunch()
return
}
// সময় নিয়ন্ত্রণ সহ অপারেশন নির্বাহ
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
saveProgress()
self.endBackgroundTask()
}
এক্সপিরেশন হ্যান্ডলার self ক্যাপচার করে — এটি একটি রিটেইন সাইকেল তৈরি করতে পারে যদি backgroundTaskID একই অবজেক্টের প্রপার্টি হিসাবে সংরক্ষিত থাকে। ক্লোজারে [weak self] ব্যবহার করুন বা শনাক্তকারী আলাদাভাবে সংরক্ষণ করুন। রিটেইন সাইকেল মেমরি লিকের কারণ — অ্যাপ্লিকেশন শেষ না হওয়া পর্যন্ত অবজেক্টটি মুক্ত হবে না।
iOS 13 প্রকাশের সাথে, Apple BGTaskScheduler প্রবর্তন করে — পুরানো Background Task API-এর আধুনিক প্রতিস্থাপন। উভয় মেকানিজম একই ধরনের কাজ সমাধান করে, কিন্তু BGTaskScheduler আরও নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে। পার্থক্য বোঝা একটি নির্দিষ্ট পরিস্থিতির জন্য সঠিক টুল বেছে নিতে সাহায্য করবে।
| বৈশিষ্ট্য | Background Task | BGTaskScheduler |
|---|---|---|
| iOS সংস্করণ | 4.0+ | 13.0+ |
| সর্বোচ্চ সময় | 30 সেকেন্ড | 30 সেকেন্ড / 10 মিনিট (processing) |
| সূচনা | didEnterBackground | শিডিউলিং + সিস্টেম |
| নির্বাহ guarantee | শুধুমাত্র ব্যাকগ্রাউন্ডে যাওয়ার সময় | সিস্টেমের জন্য সুবিধাজনক যেকোনো সময় |
| এক্সপিরেশন হ্যান্ডলার | হ্যাঁ, বাধ্যতামূলক | হ্যাঁ, task.expirationHandler-এর মাধ্যমে |
| ইন্টারনেট | শুরুতে প্রয়োজন | requiresNetworkConnectivity-এর মাধ্যমে উপলব্ধ |
| চার্জিং | প্রয়োজন নেই | processing-এর জন্য ঐচ্ছিক |
beginBackgroundTask স্বল্পমেয়াদী অপারেশনের জন্য উপযুক্ত যা ব্যাকগ্রাউন্ডে যাওয়ার সময় অবিলম্বে সম্পাদন করতে হবে: অবস্থা সংরক্ষণ, নেটওয়ার্ক অনুরোধ সম্পূর্ণ করা, ডেটা ক্যাশ করা। API সহজ এবং Info.plist কনফিগারেশন বা শনাক্তকারী নিবন্ধনের প্রয়োজন নেই। অপারেশনের জন্য আদর্শ যা 10 সেকেন্ডের কম সময় নেয়।
BGTaskScheduler কাজের জন্য উপযুক্ত যা যেকোনো সুবিধাজনক সময়ে সম্পাদন করা যেতে পারে: পর্যায়ক্রমিক সিঙ্ক্রোনাইজেশন, ক্যাশ পরিষ্কার, উইজেট আপডেট। সিস্টেম নিজেই ব্যবহারকারীর আচরণ এবং ব্যাটারি অবস্থা বিবেচনা করে সর্বোত্তম সময় নির্বাচন করে। দীর্ঘ অপারেশনের জন্য (10 মিনিট পর্যন্ত), BGProcessingTask ব্যবহার করুন।
উভয় API একই অ্যাপ্লিকেশনে ব্যবহার করা যেতে পারে। Background Task — ব্যাকগ্রাউন্ডে যাওয়ার সময় তাৎক্ষণিক অপারেশনের জন্য (ড্রাফট সংরক্ষণ)। BGTaskScheduler — নির্ধারিত আপডেটের জন্য (প্রতি 6 ঘন্টায় সিঙ্ক্রোনাইজেশন)। দায়িত্ব পৃথকীকরণ সঠিক ডেটা সংরক্ষণ এবং শক্তি-দক্ষ ব্যাকগ্রাউন্ড রক্ষণাবেক্ষণ নিশ্চিত করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, beginBackgroundTask অ্যাপ্লিকেশন নির্বাহের যেকোনো সময় কল করা যেতে পারে। তবে, সিস্টেম সময় বরাদ্দ শুধুমাত্র ব্যাকগ্রাউন্ডে যাওয়ার পরে শুরু হবে। যদি অ্যাপ্লিকেশন অগ্রভাগে থাকে, beginBackgroundTask কল করার কোনো প্রভাব নেই — backgroundTimeRemaining DBL_MAX ফেরত দেয় এবং কাজটি ব্যাকগ্রাউন্ডে যাওয়ার সময় সক্রিয় হবে।
যদি endBackgroundTask কল না করা হয়, সিস্টেম অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে সক্রিয় মনে করতে থাকে। 30 সেকেন্ড পরে, এক্সপিরেশন হ্যান্ডলার কল হবে, কিন্তু যদি সেটিতেও endBackgroundTask না থাকে — অ্যাপ্লিকেশন মেমরিতে থাকে, ব্যাটারি শেষ করে। iOS 13+-এ, সিস্টেম 3 মিনিট পরে এই ধরনের অ্যাপ্লিকেশন জোর করে শেষ করে।
মানক সময় 30 সেকেন্ড। এটি শুধুমাত্র Background Modes: Audio (প্লেব্যাক), Location (জিওলোকেশন), Bluetooth (BLE) এর মাধ্যমে বাড়ানো যায়। অথবা BGProcessingTask (iOS 13+) এর মাধ্যমে — চার্জিং এবং Wi-Fi সহ 10 মিনিট পর্যন্ত। beginBackgroundTask নিজে সীমা বাড়ানোর কোনো উপায় প্রদান করে না।
হ্যাঁ, iPadOS iOS-এর মতো একই সীমাবদ্ধতা সহ beginBackgroundTask সম্পূর্ণরূপে সমর্থন করে। Stage Manager সহ iPad-এ, অ্যাপ্লিকেশন মেমরিতে বেশি সময় থাকতে পারে — বড় RAM-এর কারণে সিস্টেম অ্যাপ্লিকেশন কম স্থগিত করে। কিন্তু 30 সেকেন্ডের ব্যাকগ্রাউন্ড টাস্ক সীমা বহাল থাকে।
ডিভাইসটি Xcode-এ সংযোগ করুন, অ্যাপ্লিকেশন চালু করুন, এটি ছোট করুন — কনসোলে সিস্টেম লগ প্রদর্শিত হবে। বিশদ লগ সংগ্রহের জন্য sysdiagnose ব্যবহার করুন: ডিভাইস থেকে sysdiagnose জোর করে ট্রিগার করুন (ভলিউম আপ + ভলিউম ডাউন + পাওয়ার)। Xcode ডিবাগ নেভিগেটরে, ব্যাকগ্রাউন্ড টাস্ক কার্যকলাপ পর্যবেক্ষণ করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন