Background Execution هي آلية تسمح بتنفيذ كود التطبيق المحمول عندما لا يكون في المقدمة. بدون هذه الآلية، يقوم النظام بتعليق التطبيق عند تصغيره. وفقًا لشركة Apple، 2026، يحد iOS من وقت الخلفية إلى 30 ثانية، بينما يتيح Android سيناريوهات أكثر مرونة عبر WorkManager وForeground Service.
النقاط الرئيسية
Background Execution هي قدرة التطبيق على مواصلة تنفيذ الكود بعد أن يقوم المستخدم بتصغيره أو التبديل إلى تطبيق آخر. بدون آليات خاصة، يضع نظام التشغيل المحمول التطبيق في حالة Suspended (موقف) في غضون ثوانٍ قليلة بعد الدخول إلى الخلفية، مما يحرر المعالج والذاكرة للتطبيقات النشطة.
يمر التطبيق المحمول بعدة حالات من دورة الحياة: Foreground (نشط)، Background (في الخلفية)، Suspended (موقف)، وTerminated (منتهي). Background هي الحالة الوحيدة التي يمكن فيها للتطبيق تنفيذ كود بدون واجهة مرئية. يحدد iOS وAndroid مدة وعمليات هذه الحالة بشكل مختلف.
التنفيذ في الخلفية ضروري لمهام مزامنة البيانات وتنزيل المحتوى ومعالجة إشعارات Push وتحديد المواقع في الخلفية وتشغيل الصوت. المزامنة هي السيناريو الأكثر شيوعًا: يرسل التطبيق البيانات إلى الخادم أو ينزل التحديثات دون مشاركة المستخدم.
القيود على التنفيذ في الخلفية ناتجة عن ثلاثة عوامل: استهلاك الطاقة وأداء الجهاز وخصوصية المستخدم. المعالج ووحدات الراديو (Wi-Fi، البيانات الخلوية) تستهلك أكبر قدر من الطاقة — كل عملية في الخلفية تقلل من عمر البطارية.
تظهر دراسات Google أن التطبيقات التي تنفذ مهامًا في الخلفية كل 5 دقائق تقلل من عمر بطارية الجهاز بنسبة 20–30% في اليوم. حتى العمليات المحسنة في الخلفية بتكرار مرة واحدة في الساعة لها تأثير ملحوظ إذا كان هناك أكثر من تطبيقين من هذا القبيل.
كل تطبيق في الخلفية يستهلك ذاكرة وصول عشوائي. عند نقص الذاكرة، يقوم النظام بتفريغ التطبيقات من الذاكرة، مما يؤدي إلى إعادة تشغيلها عند عودة المستخدم. iOS يستخدم خوارزمية Jetsam — آلية إنهاء إجباري للعمليات في الخلفية عند تجاوز حد الذاكرة. يستخدم Android LMK (Low Memory Killer) بمبدأ مشابه.
بدءًا من Android 10 وiOS 13، يطلب النظام من التطبيقات الإعلان عن الغرض من العمل في الخلفية. فرض Android قيودًا على تشغيل Broadcast Receiver في الخلفية. يتطلب iOS تحديد Background Mode في قدرات المشروع. يمكن للمستخدم تعطيل التنفيذ في الخلفية لأي تطبيق في الإعدادات.
| نظام التشغيل | الإصدار | القيود | التأثير |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST محظور | 67% من Broadcast في الخلفية معطل |
| Android | 9.0 | Doze محسن | استدعاءات الشبكة مقيدة |
| Android | 12+ | Foreground Service مقيد | التشغيل من الخلفية محظور |
| iOS | 7+ | Background App Refresh | نوافذ تحديث دورية |
| iOS | 13+ | BGTaskScheduler | جدولة بدلاً من التنفيذ |
يوفر Android عدة آليات للتنفيذ في الخلفية، كل منها يحل فئة معينة من المهام. WorkManager هو واجهة API الموصى بها للمهام المؤجلة والدورية. Foreground Service للتنفيذ الفوري مع إشعار مرئي. JobScheduler هو بديل منخفض المستوى لـ WorkManager.
WorkManager هو جزء من Android Jetpack، يوفر تنفيذ المهام في الخلفية مع ضمان الإكمال حتى بعد إعادة تشغيل الجهاز. تختار API وقت التنفيذ الأمثل مع مراعاة حالة الشبكة ومستوى البطارية ووضع Doze. WorkManager متوافق مع API 14+ ويحل محل AlarmManager وJobScheduler القديمين.
عندما يحتاج التطبيق إلى تنفيذ مهمة مرئية للمستخدم (تشغيل الموسيقى، تسجيل الموقع)، يتم استخدام Foreground Service. تعرض الخدمة إشعارًا دائمًا في شريط الحالة ولها أولوية أعلى — لن ينهيها النظام حتى انتهاء المهمة. بدءًا من Android 13، مطلوب إذن POST_NOTIFICATIONS.
بدءًا من Android 6.0، يدخل الجهاز في وضع Doze عند عدم النشاط. في هذا الوضع، يتم تأجيل عمليات الشبكة والمزامنة وJobScheduler. يتكيف WorkManager تلقائيًا مع Doze — يتم تنفيذ المهام أثناء نافذة الصيانة التالية عندما يستيقظ الجهاز من السكون للصيانة.
يستخدم iOS نهجًا أكثر صرامة للتنفيذ في الخلفية. Background App Refresh هو الآلية الرئيسية للتحديث الدوري للبيانات. BGTaskScheduler هي API لجدولة المهام وفقًا لحالة النظام. للعمليات الطويلة، تتوفر Background Modes: audio وlocation وvoip وfetch وprocessing.
Background App Refresh يسمح للتطبيق بالاستيقاظ كل 15–30 دقيقة لمزامنة البيانات. يعتمد وقت الاستيقاظ على سلوك المستخدم — يحلل النظام عدد مرات فتحه للتطبيق. يمكن للمستخدم تعطيل هذه الميزة لتطبيقات فردية في الإعدادات — عام — Background App Refresh.
بدءًا من iOS 13، حل BGTaskScheduler محل performFetch وbeginBackgroundTask القديمين. يسجل التطبيق المهام بمعرف وفاصل زمني أدنى، ويحدد النظام وقت التنفيذ الأمثل. تنقسم المهام إلى نوعين: BGProcessingTask (طويلة، 10+ دقائق) وBGAppRefreshTask (قصيرة، حتى 30 ثانية).
يخصص iOS وقتًا محدودًا لتنفيذ المهام في الخلفية — حتى 30 ثانية لـ BGAppRefreshTask وحتى 10 دقائق لـ BGProcessingTask. عند تجاوز الحد، ينهي النظام المهمة إجباريًا. يجب على المطور استدعاء معالج الانتهاء (expiration handler) لحفظ النتائج الوسيطة.
لنلقِ نظرة على تطبيق عملي للتنفيذ في الخلفية على Android باستخدام WorkManager. مثال لمزامنة البيانات كل 8 ساعات مع مراعاة حالة الشبكة. يضمن WorkManager تنفيذ المهمة حتى بعد إعادة تشغيل الجهاز.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "تمت مزامنة البيانات")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// تشغيل المهمة الدورية كل 8 ساعات
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
للعمليات الطويلة المرئية للمستخدم، استخدم Foreground Service. مثال لتنزيل ملف مع عرض التقدم في الإشعار. تستدعي الخدمة startForeground() مع إشعار لا يمكن إزالته. عند اكتمال التنزيل — stopForeground(STOP_FOREGROUND_REMOVE).
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("تنزيل الملف")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
على iOS، يتم تكوين التنفيذ في الخلفية عبر BGTaskScheduler. مثال لتسجيل وتنفيذ مهمة تحديث المحتوى. يجب على التطبيق تسجيل معرف المهمة في Info.plist واستدعاء submit عندما يجب جدولة المهمة.
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// حفظ البيانات الوسيطة
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
للعمليات الطويلة (تنظيف ذاكرة التخزين المؤقت، معالجة البيانات)، استخدم BGProcessingTask. يمنح النظام حتى 10 دقائق للتنفيذ. يتم التشغيل فقط عندما يكون الجهاز قيد الشحن ومتصلًا بشبكة Wi-Fi. يتطلب معرفًا منفصلًا في Info.plist وتسجيلًا عبر register(forTaskWithIdentifier:).
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
يختلف Android وiOS جوهريًا في فلسفة التنفيذ في الخلفية. Android يوفر أدوات مرنة مع تحكم أكبر ولكنه يتطلب من المطور اختيار API الصحيح. iOS يحد من الإمكانيات ولكنه يضمن أداءً مستقرًا وعمر بطارية للمستخدم.
| المعيار | Android | iOS |
|---|---|---|
| API الموصى بها | WorkManager | BGTaskScheduler |
| الحد الأقصى لوقت المهمة | غير محدود (Foreground Service) | 30 ث / 10 دق (processing) |
| المهام الدورية | نعم، عبر PeriodicWorkRequest | نعم، عبر BGAppRefreshTask |
| ضمان التنفيذ | نعم، حتى بعد إعادة التشغيل | لا — النظام يقرر متى |
| الوصول إلى الشبكة في الخلفية | مقيد بوضع Doze | عبر URLSession مع background config |
| تحديد المواقع في الخلفية | Foreground Service + إذن | Background Mode location + NSLocation |
| الصوت في الخلفية | Foreground Service مع إشعار وسائط | Background Mode audio + AVAudioSession |
WorkManager مثالي للمهام التي يجب إكمالها بغض النظر عن حالة التطبيق: مزامنة البيانات، إرسال التحليلات، معالجة قوائم الانتظار. تضمن API التنفيذ حتى بعد إيقاف تشغيل الجهاز — يتم إعادة جدولة المهمة بعد التشغيل.
BGTaskScheduler مناسب للمهام التي يمكن للنظام تنفيذها في أي وقت مناسب: تنزيل محتوى جديد، تحديث الأدوات، تنظيف ذاكرة التخزين المؤقت. غير مناسب للعمليات العاجلة — يؤخر النظام المهمة إذا كان الجهاز في وضع Doze أو البطارية منخفضة.
الأسئلة الشائعة
Background Execution هو مفهوم عام يصف أي كود يتم تنفيذه في الخلفية. Background Modes هي آلية محددة في iOS تسمح للتطبيق بأداء أنواع معينة من العمليات في الخلفية: الصوت، تحديد المواقع، VoIP، fetch. يستخدم Android نهجًا مشابهًا عبر أنواع Foreground Service.
على iOS، هذا هو الحد القياسي لـ BGAppRefreshTask. ينهي النظام المهمة إجباريًا عند بلوغ الحد. على Android، يحدث موقف مشابه عندما لا يستخدم التطبيق WorkManager أو Foreground Service — يتم إنهاء Service العادي من قبل النظام بعد الانتقال إلى الخلفية.
على Android، استخدم WorkManager — يضمن التنفيذ حتى بعد إعادة التشغيل. على iOS، لا يمكن ضمان التنفيذ — يقرر النظام متى يشغل المهمة. الطريقة الوحيدة لضمان التنفيذ هي استخدام Background Modes (audio, location) مع مؤشر مرئي للمستخدم.
على iOS، استدع UIApplication.shared.backgroundRefreshStatus — الحالة .available أو .denied أو .restricted. على Android، استخدم PowerManager.isIgnoringBatteryOptimizations() للتحقق من الإعفاء من تحسين البطارية. لـ WorkManager لا يلزم التحقق — API تتعامل مع قيود النظام بنفسها.
إشعارات Push هي الآلية الرئيسية لتشغيل الإجراءات بدون كود في الخلفية. على iOS، يتوفر PushKit لـ VoIP و Silent Push لتحديث البيانات. على Android — High Priority FCM و Notification Trampoline. WebSockets عبر Foreground Service بديل للتطبيقات في الوقت الفعلي.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا