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
}
}
पृष्ठभूमि में नेटवर्क अनुरोधों को विशेष ध्यान देने की आवश्यकता है — समाप्ति हैंडलर प्रतिक्रिया प्राप्त करने से पहले अनुरोध को बाधित कर सकता है। URLSession को dataTask के साथ उपयोग करें और भेजने से पहले 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 | शेड्यूलिंग + सिस्टम |
| निष्पादन गारंटी | केवल पृष्ठभूमि में जाने पर | सिस्टम के लिए सुविधाजनक किसी भी समय |
| समाप्ति हैंडलर | हाँ, अनिवार्य | हाँ, 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: ऑडियो (प्लेबैक), स्थान (जियोलोकेशन), ब्लूटूथ (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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें