Background ایپ لائف سائیکل کی ایک حالت ہے جس میں یہ چلتا رہتا ہے لیکن اسکرین پر ظاہر نہیں ہوتا۔ ہم iOS اور Android پر پس منظر کے کام کی بنیادی باتیں بیان کرتے ہیں: حدود، ٹائم آؤٹ، beginBackgroundTask، WorkManager اور Service کے ذریعے پس منظر کے کام، نیز Background کی صحیح ہینڈلنگ کے لیے بہترین طریقے۔
اہم نکات
Background ایپ کی وہ حالت ہے جس میں یہ آپریٹنگ سسٹم میں موجود رہتا ہے، کوڈ چلاتا ہے اور وسائل استعمال کرتا ہے، لیکن ڈیوائس اسکرین پر ظاہر نہیں ہوتا۔ صارف ہوم اسکرین پر، کسی دوسری ایپ میں ہے یا ڈیوائس کی اسکرین لاک ہے۔ iOS پر، Background Inactive کے بعد آتا ہے — منتقلی کا سلسلہ: Active → Inactive → Background۔ Android پر، onStop Activity کے Background میں منتقلی کا اشارہ دیتا ہے۔
دونوں پلیٹ فارم پس منظر کے کام پر سخت پابندیاں لگاتے ہیں۔ iOS Background میں داخل ہونے کے بعد کوڈ چلانے کے لیے ایک محدود ونڈو (عام طور پر 30 سیکنڈ) فراہم کرتا ہے، جس کے بعد ایپ Suspended میں منتقل ہو جاتی ہے۔ Android زیادہ لچکدار ہے: نظر آنے والی اطلاع کے ساتھ Foreground Service غیر معینہ مدت تک چل سکتی ہے، لیکن عام Background Service چند منٹوں تک محدود ہے۔ ڈویلپر کا بنیادی کام حالت کو صحیح طریقے سے محفوظ کرنا اور سسٹم کے پس منظر کے کام APIs کے ذریعے کام جاری رکھنے کا شیڈول بنانا ہے۔
سسٹم میموری کم ہونے پر کسی بھی وقت پس منظر کی ایپ کو ختم کر سکتا ہے۔ ختم ہونے پر، تمام غیر محفوظ کردہ ڈیٹا ضائع ہو جاتا ہے۔ لہذا applicationDidEnterBackground (iOS) یا onStop (Android) میں حالت محفوظ کرنا انتہائی اہم ہے۔ ختم ہونے کے بعد، اگلا لانچ Not Running سے کولڈ سٹارٹ کے ساتھ شروع ہوتا ہے اور محفوظ کردہ حالت بحال کرتا ہے۔
Background اور Suspended کے درمیان فرق کرنا ضروری ہے۔ Background — ایپ فعال طور پر کوڈ چلا رہی ہے۔ Suspended — ایپ میموری میں ہے لیکن کوڈ نہیں چلا رہی — یہ منجمد ہے۔ iOS پر، ایپ پس منظر کے کام مکمل کرنے کے بعد Background سے Suspended میں جاتی ہے۔ Android میں Suspended نہیں ہے — عمل یا تو موجود ہے (Background سمیت) یا ختم ہو چکا ہے (Not Running)۔ تاہم، Android LMK (Low Memory Killer) کے ذریعے تھریڈ کی عملدرآمد روک سکتا ہے۔
| خصوصیت | iOS Background | Android Background |
|---|---|---|
| کوڈ چلتا ہے | ہاں، 30 سیکنڈ تک | ہاں، API پر منحصر |
| UI نظر آتا ہے | نہیں | نہیں |
| ڈیفالٹ ٹائم آؤٹ | ~30 سیکنڈ (beginBackgroundTask) | کئی منٹ (Service) |
| لا محدود کام | صرف خصوصی زمرے (آڈیو، VoIP، نیویگیشن) | اطلاع کے ساتھ Foreground Service |
| عملدرآمد کی ضمانت | نہیں — سسٹم کسی بھی وقت ختم کر سکتا ہے | WorkManager عملدرآمد کی ضمانت دیتا ہے |
| اجازت درکار | ہاں — Info.plist میں capabilities | ہاں — FOREGROUND_SERVICE اجازت |
| اگلی حالت | Suspended → Not Running | Not Running (یا دوبارہ شروع) |
iOS پر، Background کو ڈیلیگیٹ طریقہ applicationDidEnterBackground کے ذریعے ہینڈل کیا جاتا ہے۔ اس طریقہ میں، ڈویلپر کو صارف کی حالت محفوظ کرنی چاہیے، وسائل خالی کرنے چاہیے اور پس منظر کے کام مکمل کرنے چاہیے۔ Background میں داخل ہونے کے بعد کوڈ چلانے کے لیے، beginBackgroundTask(expirationHandler:) استعمال کیا جاتا ہے — ایک API جو سسٹم سے اضافی وقت (عام طور پر 30 سیکنڈ) کی درخواست کرتی ہے۔ اگر کام اس وقت میں مکمل نہیں ہوتا، تو expirationHandler کال کیا جاتا ہے، اور ایپ کو زبردستی Suspended میں منتقل کر دیا جاتا ہے۔
iOS 13 کے ساتھ، Apple نے BGTaskScheduler متعارف کرایا — پس منظر کے کاموں کو شیڈول کرنے کے لیے ایک جدید API۔ beginBackgroundTask کے برعکس، جو پس منظر میں جانے کے بعد صرف ختم کرنے کا وقت دیتا ہے، BGTaskScheduler مستقبل میں کاموں کی عملدرآمد کو شیڈول کرنے کی اجازت دیتا ہے — مثال کے طور پر، گھنٹے میں ایک بار مواد اپ ڈیٹ کرنا یا رات کو تجزیہ اپ لوڈ کرنا۔ BGTaskScheduler نئے منصوبوں کے لیے تجویز کردہ طریقہ ہے، کیونکہ یہ بیٹری کے لحاظ سے زیادہ موثر ہے۔
import UIKit
import BackgroundTasks
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
// ایپ پس منظر میں چلی گئی — پس منظر کا کام شروع کر رہے ہیں
func applicationDidEnterBackground(_ application: UIApplication) {
saveAppState()
startBackgroundTask()
}
private func startBackgroundTask() {
backgroundTaskID = UIApplication.shared.beginBackgroundTask { [weak self] in
// وقت ختم — زبردستی ختم کر رہے ہیں
self?.endBackgroundTask()
}
// پس منظر کے کام کی نقل (سرور پر ڈیٹا محفوظ کرنا)
DispatchQueue.global().async { [weak self] in
uploadAnalyticsData()
self?.endBackgroundTask()
}
}
private func endBackgroundTask() {
guard backgroundTaskID != .invalid else { return }
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// BGTaskScheduler رجسٹریشن
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
handleAppRefresh(task: task as! BGAppRefreshTask)
}
return true
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = { task.setTaskCompleted(success: false) }
fetchLatestData { result in
task.setTaskCompleted(success: result)
}
}
}کوڈ iOS پر مکمل Background پروسیسنگ دکھاتا ہے۔ applicationDidEnterBackground ٹائم آؤٹ اور expirationHandler کے ساتھ beginBackgroundTask کے ذریعے ایک پس منظر کا کام شروع کرتا ہے۔ اسی وقت، BGTaskScheduler کو متواتر مواد کی اپ ڈیٹ کے لیے رجسٹر کیا جاتا ہے۔ beginBackgroundTask فوری بندش کے کاموں کے لیے استعمال ہوتا ہے، BGTaskScheduler طویل مدتی منصوبہ بندی کے لیے استعمال ہوتا ہے۔ دونوں APIs کو کام کے شناخت کنندگان کے مناسب انتظام کی ضرورت ہوتی ہے۔
Android پر، Background کو کئی APIs کے ذریعے منظم کیا جاتا ہے۔ روایتی Service پس منظر میں کوڈ چلانے کی اجازت دیتی ہے، لیکن Android 8+ (API 26) سے، Background Service محدود ہے: سسٹم ایپ کے پس منظر میں جانے کے چند منٹ بعد اسے ختم کر دیتا ہے۔ مستقل اطلاع کے ساتھ Foreground Service غیر معینہ مدت تک چل سکتی ہے۔ WorkManager ڈیوائس ریبوٹ کے بعد بھی عملدرآمد کی ضمانت کے ساتھ پس منظر کے کاموں کے لیے تجویز کردہ حل ہے۔
Android، iOS کے برعکس، طویل عرصے تک چلنے والے پس منظر کے عمل کو سپورٹ کرتا ہے۔ Foreground Service ان کاموں کے لیے استعمال ہوتی ہے جو صارف کو دیکھنے چاہئیں — موسیقی چلانا، نیویگیشن، ورزش کی ٹریکنگ۔ JobScheduler اور WorkManager ان کاموں کے لیے استعمال ہوتے ہیں جو ملتوی کیے جا سکتے ہیں: ڈیٹا سنکرونائزیشن، لاگ اپ لوڈ، کیش اپ ڈیٹ۔ بنیادی فرق: Android شرائط (Wi-Fi، چارجنگ، ڈیوائس غیر فعال) کے ساتھ کام شیڈول کرنے کی اجازت دیتا ہے — جو بیٹری اور ٹریفک بچاتا ہے۔
import android.app.Service
import android.content.Intent
import android.os.IBinder
import androidx.work.*
// 1. طویل پس منظر کے کام کے لیے Foreground Service
class SyncService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = createNotification()
startForeground(NOTIFICATION_ID, notification)
performBackgroundWork()
return START_STICKY
}
private fun performBackgroundWork() {
Thread {
// سرور کے ساتھ ڈیٹا سنکرونائزیشن
syncDataToServer()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
}.start()
}
override fun onBind(intent: Intent?): IBinder? = null
}
// 2. ملتوی پس منظر کے کاموں کے لیے WorkManager
class DataSyncWorker(
private val context: Context,
private val params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// سرور پر تجزیہ اپ لوڈ کرنا
uploadAnalytics()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry() else Result.failure()
}
}
}
// WorkManager کام کی شیڈولنگ
fun scheduleBackgroundSync(context: Context) {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<DataSyncWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context).enqueue(request)
}کوڈ Android پر پس منظر کے کام کے دو طریقے دکھاتا ہے۔ SyncService — فوری اور طویل پس منظر کے کام کے لیے اطلاع کے ساتھ Foreground Service۔ DataSyncWorker — شرائط (Wi-Fi، چارجنگ) کے ساتھ ملتوی کاموں کے لیے WorkManager۔ WorkManager ڈیوائس ریبوٹ کے بعد بھی عملدرآمد کی ضمانت دیتا ہے اور دوبارہ کوششوں کے لیے ایکسپونینشل بیک آف سپورٹ کرتا ہے۔ Foreground Service کو سٹیٹس بار میں مستقل اطلاع کی ضرورت ہوتی ہے۔
دونوں موبائل پلیٹ فارم مسلسل پس منظر کے کام کے قوانین سخت کر رہے ہیں۔ iOS پر، OS کی ہر نئی نسل پس منظر میں عملدرآمد کا وقت کم کرتی ہے اور نئی پابندیاں شامل کرتی ہے۔ Android پر، Google تیزی سے سخت پاور سیونگ موڈ (Doze، App Standby) متعارف کرا رہا ہے۔ ڈویلپرز کو موجودہ حدود سے آگاہ رہنا چاہیے تاکہ ایپ سسٹم کے ذریعے قبل از وقت ختم نہ ہو۔
iOS پر، iOS 13 سے شروع ہو کر، سسٹم ان ایپس کے لیے پس منظر کے کام غیر فعال کر دیتا ہے جو پس منظر کے وقت کا غلط استعمال کرتی ہیں۔ ہر ایپ صارف کے رویے کی بنیاد پر مخصوص حدود حاصل کرتی ہے۔ BGTaskScheduler بہترین وقت پر عملدرآمد کا شیڈول بناتا ہے — مثال کے طور پر، جب ڈیوائس Wi-Fi سے منسلک ہو اور چارج ہو رہی ہو۔ جو ایپس BGTaskScheduler کو صحیح طریقے سے استعمال کرتی ہیں انہیں زیادہ پس منظر کا وقت ملتا ہے۔
Android پر، Android 9 (API 28) سے شروع ہو کر، پس منظر کا کام Doze موڈ سے محدود ہے، جو ڈیوائس کے غیر فعال ہونے پر فعال ہوتا ہے۔ Doze میں ایپس پس منظر کے کام نہیں کر سکتیں، نیٹ ورک منقطع ہو جاتا ہے، JobScheduler اور WorkManager Doze سے باہر نکلنے تک کام ملتوی کر دیتے ہیں۔ Foreground Service Doze کو نظرانداز کرنے کا واحد طریقہ ہے، لیکن غلط استعمال صارف کے ذریعے ایپ کے بلاک ہونے اور اجازتوں کی منسوخی کا باعث بنتا ہے۔
| حدود | iOS | Android |
|---|---|---|
| پس منظر کے کام کا ٹائم آؤٹ | ~30 سیکنڈ (beginBackgroundTask) | کئی منٹ (JobScheduler) |
| لا محدود پس منظر | آڈیو، VoIP، نیویگیشن، Bluetooth | Foreground Service + اطلاع |
| پاور سیونگ | Low Power Mode — پس منظر کے کام غیر فعال | Doze، App Standby، بیٹری آپٹیمائزیشن |
| شیڈولنگ | BGTaskScheduler (iOS 13+) | WorkManager (Android Jetpack) |
| ریبوٹ کے بعد | صرف push اطلاع | WorkManager کام محفوظ رکھتا ہے |
| زیادہ سے زیادہ عملدرآمد کا وقت | ~30 منٹ (آڈیو) | لا محدود (Foreground Service) |
پہلا اصول — پس منظر میں وسائل کی کھپت کم سے کم کریں۔ زیادہ تر پس منظر کے کام اس وقت ملتوی کیے جا سکتے ہیں جب ڈیوائس چارج ہو رہی ہو اور Wi-Fi سے منسلک ہو۔ شرائط کے ساتھ کام شیڈول کرنے کے لیے BGTaskScheduler (iOS) اور WorkManager (Android) استعمال کریں۔ پس منظر میں بھاری حساب کتاب نہ چلائیں — اس سے بیٹری ختم ہوتی ہے اور CPU سست ہو جاتا ہے۔
دوسرا اصول — beginBackgroundTask کے لیے ہمیشہ expirationHandler متعین کریں۔ اگر ایپ مقررہ وقت میں کام مکمل نہیں کرتی، تو سسٹم اسے زبردستی Suspended میں منتقل کرے گا یا ختم کر دے گا۔ ExpirationHandler ڈیٹا محفوظ کرنے اور کام صحیح طریقے سے ختم کرنے کا آخری موقع ہے۔ Android پر، WorkManager میں setForegroundAsync استعمال کریں اگر زیادہ وقت درکار ہو تو عام کام کو پیش منظر میں تبدیل کرنے کے لیے۔
تیسرا اصول — شروع کرنے سے پہلے پس منظر کے کام کی پابندیاں چیک کریں۔ iOS پر، باقی وقت چیک کرنے کے لیے UIApplication.shared.backgroundTimeRemaining استعمال کریں۔ Android پر، ActivityManager.isBackgroundRestricted() چیک کریں — اگر true ہے، تو ایپ پس منظر کے کام نہیں چلا سکتی، اور آپ کو صارف کو ترتیبات میں پابندیاں ہٹانے کا مشورہ دینا چاہیے۔ یہ خاص طور پر اہم پس منظر کے افعال والی ایپس کے لیے اہم ہے — الارم، کیلنڈر، سنکرونائزیشن۔
چوتھا اصول — پس منظر کے کاموں کو حقیقی ڈیوائس پر آزمائیں۔ سمیلیٹر اور ایمولیٹر حقیقی پس منظر کے کام کی پابندیوں کو دوبارہ پیش نہیں کرتے۔ iOS پر، Xcode میں Debug → Simulate Background Fetch استعمال کریں۔ Android پر، ریبوٹ کے بعد WorkManager کی جانچ کے لیے adb shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED استعمال کریں۔ کم بیٹری والی ڈیوائس پر حقیقی ٹیسٹ زیادہ تر پس منظر کے کام کے مسائل ظاہر کرتے ہیں۔
import UIKit
final class BackgroundTaskManager {
static let shared = BackgroundTaskManager()
private var tasks: [String: UIBackgroundTaskIdentifier] = [:]
func startTask(name: String, expiration: @escaping () -> Void) {
let remaining = UIApplication.shared.backgroundTimeRemaining
print("پس منظر میں باقی وقت: \(remaining) سیکنڈ")
let task = UIApplication.shared.beginBackgroundTask { [weak self] in
print("کام کے لیے وقت ختم: \(name)")
expiration()
self?.endTask(name: name)
}
tasks[name] = task
}
func endTask(name: String) {
guard let task = tasks.removeValue(forKey: name),
task != .invalid
else { return }
UIApplication.shared.endBackgroundTask(task)
}
}کوڈ ایک پس منظر کے کام مینیجر دکھاتا ہے جو باقی وقت کو ٹریک کرتا ہے اور شناخت کنندگان کا انتظام کرتا ہے۔ backgroundTimeRemaining زبردستی ختم ہونے سے پہلے سیکنڈز کی تعداد لوٹاتا ہے — اگر قدر لامحدود ہے، تو ایپ بغیر پابندی کے چل رہی ہے (آڈیو، نیویگیشن)۔ مینیجر مختلف ناموں کے ساتھ متعدد پس منظر کے کام شروع کرنے اور ہر ایک کو صحیح طریقے سے مکمل کرنے کی اجازت دیتا ہے۔ یہ طریقہ پس منظر کے کام کے رساو کو روکتا ہے اور یقینی بناتا ہے کہ سسٹم بند نہ کیے گئے کاموں کی وجہ سے ایپ کو ختم نہ کرے۔
اکثر پوچھے گئے سوالات
ہاں، محدود تعداد میں زمروں کے لیے: آڈیو (AVAudioSession زمرہ .playback)، VoIP (PushKit)، نیویگیشن (allowsBackgroundLocationUpdates کے ساتھ CLLocationManager)، Bluetooth (سنٹرل بیک گراؤنڈ موڈ)، پس منظر اپ ڈیٹ (BGTaskScheduler)۔ باقی سب کے لیے — زیادہ سے زیادہ 30 سیکنڈ۔ iOS 16+ میں، Apple نے اجازت شدہ زمروں کے لیے بھی تقاضے سخت کر دیے ہیں۔
beginBackgroundTask پس منظر میں جانے کے بعد ایپ کی زندگی تقریباً 30 سیکنڈ بڑھانے کے لیے ایک سنکرونس API ہے۔ اسے applicationDidEnterBackground میں کال کیا جاتا ہے۔ BGTaskScheduler سسٹم ٹرگرز (وقت، مقام، مواد اپ ڈیٹ) کے ذریعے مستقبل میں کام شیڈول کرنے کے لیے ایک ایسنکرونس API ہے۔ BGTaskScheduler جدید طریقہ ہے، جسے Apple نے iOS 13+ کے لیے تجویز کیا ہے۔
Android 8 (API 26) سے شروع ہو کر، Background Service ایپ کے پس منظر میں جانے کے چند منٹ بعد ختم ہو جاتی ہے۔ حل: لمبے کاموں کے لیے اطلاع کے ساتھ Foreground Service یا ملتوی کاموں کے لیے WorkManager استعمال کریں۔ ترتیبات میں اپنی ایپ کے لیے بیٹری آپٹیمائزیشن چیک کریں — اگر یہ آپٹیمائزڈ ہے، تو سسٹم پس منظر کے کاموں کو ملتوی یا منسوخ کر سکتا ہے۔
ہوم اسکرین پر جانے کے لیے Cmd+Shift+H دبائیں۔ Xcode میں، Debug → Simulate Background Fetch استعمال کریں۔ beginBackgroundTask چیک کرنے کے لیے، کنسول (Shift+Cmd+C) کھولیں اور e UIApplication.shared.backgroundTimeRemaining کال کریں۔ Xcode 15+ میں، سمیلیٹر کے Diagnostics ٹیب میں Background Execution سکرپٹ دستیاب ہے۔
Process Death وسائل کی کمی یا پس منظر میں غیرفعالیت پر سسٹم کے ذریعے Android پروسیس کا ختم ہونا ہے۔ iOS کے برعکس، Android میں Suspended نہیں ہے — پروسیس یا تو زندہ ہے (پس منظر میں ہو سکتا ہے) یا مردہ ہے (Not Running)۔ Process Death OS کا معمول کا رویہ ہے، اور ایپ کو اس کے بعد SavedStateHandle، onSaveInstanceState یا DataStore کے ذریعے حالت بحال کرنی چاہیے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔