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 Simulator میں، ہوم بٹن (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: آڈیو (پلے بیک)، مقام (جیولوکیشن)، 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں