تحميل البيانات، مزامنة المحتوى، إرسال التحليلات — العديد من المهام لا تتطلب مشاركة نشطة من المستخدم. ومع ذلك، تحد الأجهزة المحمولة من العمل الخلفي لتوفير البطارية والحفاظ على الأداء. المهام الخلفية (background tasks) هي آليات تسمح للتطبيق بتنفيذ التعليمات البرمجية عندما لا يراه المستخدم. في هذه المقالة سنستعرض WorkManager وBGTaskScheduler وForeground Service وميزات Doze Mode. للمزيد من التفاصيل، راجع الوثائق الرسمية لـ WorkManager.
النقاط الرئيسية
المهمة الخلفية هي أي كود يتم تنفيذه عندما لا يكون التطبيق في المقدمة (الشاشة النشطة). يمكن أن يشمل ذلك: مزامنة البيانات الدورية مع الخادم، تنزيل الملفات الكبيرة، معالجة إشعارات الدفع، تتبع الموقع الجغرافي، تحديث الأدوات. لكل منصة قيودها الخاصة على العمل الخلفي: iOS أكثر صرامة (10–30 دقيقة من الوقت الخلفي)، Android أكثر مرونة لكنه شدد القواعد منذ الإصدار 9.
تُبنى بنية المهام الخلفية على ثلاثة مستويات: (1) المهام الفورية — تُنفذ مباشرة (Foreground Service)؛ (2) المهام المؤجلة — تُنفذ عند توفر الظروف المناسبة (WorkManager، BGTaskScheduler)؛ (3) المهام الدورية — تتكرر بفاصل زمني محدد. اختيار المستوى الصحيح يحدد ما إذا كانت المهمة ستكتمل في الوقت المحدد وما إذا كانت ستؤدي إلى رفض التطبيق من المتجر.
على كلا النظامين، توصي Google/Apple بشدة باستخدام APIs التصريحية بدلاً من إدارة الخيوط مباشرة في الخلفية. WorkManager على Android وBGTaskScheduler على iOS يسمحان للنظام بتوزيع العمل الخلفي بشكل مثالي بين التطبيقات، وتجميع المهام لتوفير الطاقة. في IT Sectr، نبدأ دائمًا تصميم بنية الخلفية بتحليل متطلبات تكرار التحديثات وإلحاحها.
يوفر iOS عدة آليات للعمل الخلفي. Background Fetch — تحديث دوري للمحتوى بفاصل زمني يحدده النظام (وليس المطور). يحصل التطبيق على نافذة ~30 ثانية لتنزيل بيانات جديدة. يتم تفعيل Background Fetch عبر Capabilities ← Background Modes ← Background Fetch ويتم تنفيذه في AppDelegate: application(_:performFetchWithCompletionHandler:).
BGTaskScheduler هو API الحديث لـ iOS 13+، الذي يحل محل Background Fetch. يقوم المطور بتسجيل مهمة بمعرف، ويقوم النظام بتشغيلها عند توفر الظروف المناسبة. BGAppRefreshTask — للتحديثات القصيرة للمحتوى؛ BGProcessingTask — للمهام الطويلة (تنظيف ذاكرة التخزين المؤقت، مزامنة قاعدة البيانات). يتم تسجيل المهام عند تشغيل التطبيق، ويقوم النظام بجدولة تنفيذها مع مراعاة حالة البطارية والشبكة ونشاط المستخدم.
Background Modes — قائمة بالأوضاع التي تسمح بالعمل الخلفي لسيناريوهات محددة: Audio (تشغيل الخلفية)، Location (GPS)، VoIP (المكالمات عبر PushKit)، BLE (الاتصال بأجهزة Bluetooth)، Processing (المهام الطويلة عبر BGTaskScheduler). كل وضع يتطلب تبريرًا أثناء مراجعة App Store. استخدام الأوضاع دون حاجة حقيقية هو سبب شائع لرفض التطبيق.
Significant Location Change — آلية للتطبيقات التي لا تحتاج إلى تحديد موقع جغرافي مستمر ولكنها تحتاج إلى معرفة التنقل الكبير للمستخدم (أكثر من 500 متر). يقوم النظام بتنبيه التطبيق عند تغيير برج الخلوي. هذه الآلية توفر البطارية بشكل كبير مقارنة بتتبع GPS المستمر.
يقدم Android أغنى مجموعة من APIs للمهام الخلفية، لكن منذ الإصدار 8.0 (API 26)، أصبحت القواعد أكثر صرامة. WorkManager هو الحل الموصى به من Google لجميع أنواع المهام الخلفية. يضمن WorkManager تنفيذ المهمة حتى بعد إعادة تشغيل الجهاز (عبر BootReceiver) ويدعم سلاسل المهام وLiveData/Flow القابل للمراقبة والتوافق مع الإصدارات السابقة حتى API 14.
يستخدم WorkManager Worker — فئة أساسية بطريقة doWork(). تحدد Constraints شروط التنفيذ: NetworkType.CONNECTED، BatteryNotLow، StorageNotLow. PeriodicWorkRequest — للمهام الدورية بفاصل زمني أدنى 15 دقيقة. يتكيف WorkManager تلقائيًا مع Doze Mode وApp Standby، ويجمع المهام في نوافذ الصيانة. مثال على Worker بسيط:
class SyncWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
val repository =
Injection.provideRepository(applicationContext)
repository.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Запланировать задачу
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
JobScheduler — API أقدم (Android 5+، API 21). يقوم بجدولة المهام مع تحديد الشروط (الشبكة، الشحن، الخمول). القيد: لا يدعم إعادة تشغيل الجهاز (يحتاج BootReceiver) وليس له حالة قابلة للمراقبة. JobScheduler مناسب للمهام البسيطة في المشاريع القديمة؛ للمشاريع الجديدة، استخدم WorkManager.
Foreground Service — خدمة يراها المستخدم عبر إشعار دائم (ongoing notification). تُستخدم لـ: تشغيل الموسيقى، تتبع GPS، تنزيل الملفات الكبيرة. Foreground Service له أولوية عالية — لن يقتله النظام عند نقص الذاكرة. بدءًا من Android 13، مطلوب إذن FOREGROUND_SERVICE_SPECIAL_USE لبعض الأنواع. البديل هو WorkManager مع ForegroundServiceOption (المهام الطويلة).
AlarmManager — للمهام التي يجب تنفيذها في وقت محدد (منبه، تذكير). يمكن لـ AlarmManager إيقاظ الجهاز من Doze Mode (setAlarmClock). لا يُوصى به للمزامنة العادية بسبب استهلاكه العالي للطاقة. للمهام الدورية، استخدم WorkManager، وAlarmManager فقط عندما يكون الوقت المحدد حرجًا.
| السيناريو | iOS | Android |
|---|---|---|
| تحديث المحتوى الدوري | BGAppRefreshTask (BGTaskScheduler) | WorkManager (PeriodicWorkRequest) |
| مهمة خلفية طويلة | BGProcessingTask | WorkManager + ForegroundService |
| تشغيل الصوت | Background Audio Mode | Foreground Service |
| تتبع GPS | Significant Location Change / Background Location | Foreground Service + FusedLocationProvider |
| VoIP / المكالمات | PushKit + CallKit | ConnectionService + Foreground Service |
| الوقت المحدد (منبه) | UNNotificationRequest (calendar) | AlarmManager |
| معالجة الدفع (خلفية) | Notification Service Extension | FirebaseMessagingService (onMessageReceived) |
Doze Mode هو وضع توفير الطاقة في Android يؤثر على تنفيذ المهام الخلفية. تم تقديمه في Android 6.0 (API 23). عندما لا يكون الجهاز قيد الشحن والشاشة مطفأة والجهاز ثابت، يمنع Doze Mode طلبات الشبكة ويؤجل JobScheduler وWakeLock. بشكل دوري، يفتح Doze نوافذ الصيانة — فترات قصيرة يمكن للتطبيقات فيها تنفيذ المهام المؤجلة. منذ Android 7.0 (API 24)، يتم تنشيط Doze عند إطفاء الشاشة، وليس فقط عند الثبات التام.
App Standby — وضع يتم فيه وضع التطبيقات غير المستخدمة في حالة انتظار. إذا لم يكن للتطبيق إشعار نشط ولم يتم فتحه لعدة أيام، يتم وضعه في Standby Bucket: نشط، working، frequent، rare. كلما قل استخدام التطبيق، زادت القيود: يتم تأجيل طلبات الشبكة، حظر المزامنة، لا يتم تشغيل JobScheduler.
WakeLock — آلية تبقي الجهاز مستيقظًا (تمنعه من النوم). تُستخدم لإكمال العمليات الهامة. يجب تحرير WakeLock بعد إتمام المهمة، وإلا ستنفد البطارية في غضون ساعات. لا يعمل WakeLock في Doze Mode — يتجاهله النظام. العمل مع WakeLock على Android 8+ يتطلب إذن WAKE_LOCK وإدارة صحيحة لدورة الحياة.
في IT Sectr، نأخذ في الاعتبار Doze Mode وApp Standby في مرحلة التصميم. يتعامل WorkManager تلقائيًا مع هذه الأوضاع، لكن بالنسبة لـ Foreground Service يجب التخطيط لمعالجة صحيحة للانتقالات إلى Doze. يُوصى باختبار العمل الخلفي على أجهزة حقيقية مع تمكين وضع توفير الطاقة وبعد فترات خمول طويلة.
عند تصميم المهام الخلفية، اتبع هذه النصائح. 1. استخدم WorkManager دائمًا لمشاريع Android الجديدة. يحل مشاكل التوافق وDoze Mode وإعادة تشغيل الجهاز. 2. على iOS، فضل BGTaskScheduler على Background Fetch لـ iOS 13+. 3. استخدم Foreground Service فقط عندما تتطلب المهمة حقًا إشعارًا مرئيًا. 4. لا تسيء استخدام WakeLock — فهذا يقتل البطارية ويمكن أن يؤدي إلى رفض التطبيق. 5. اختبر المهام الخلفية في Doze Mode: adb shell dumpsys deviceidle force-idle. 6. تحقق دائمًا من إكمال المهمة من خلال التسجيل والتحليلات. 7. تذكر الحدود: iOS يعطي ~30 ثانية لـ Background Fetch و~بضع دقائق لـ BGProcessingTask. Android WorkManager لا يضمن وقت تنفيذ محدد.
الأسئلة الشائعة
Background Service يعمل بدون إشعار مرئي ويمكن للنظام إنهاؤه في أي وقت. Foreground Service يجب أن يعرض إشعارًا دائمًا (ongoing notification) وله أولوية أعلى. يُستخدم Foreground Service لتشغيل الموسيقى وتتبع GPS.
Doze Mode هو وضع توفير الطاقة في Android يعطل الوصول إلى الشبكة ويؤجل JobScheduler/WakeLock عندما لا يكون الجهاز قيد الاستخدام. يتكيف WorkManager مع Doze Mode تلقائيًا.
على iOS، تُنفذ المهام الخلفية عبر Background Fetch (تحديثات دورية) أو BGTaskScheduler (مهام مؤجلة) أو Background Modes (صوت، VoIP، BLE، موقع). BGTaskScheduler هو API الحديث لـ iOS 13+، الذي يحل محل Background Fetch.
WorkManager هو الحل الموصى به من Google لجميع المهام الخلفية على Android. JobScheduler هو API أقدم بقدرات محدودة. WorkManager يدعم سلاسل المهام وLiveData/Flow القابل للمراقبة والتوافق مع الإصدارات السابقة حتى API 14.
App Standby هو وضع Android حيث يتم وضع التطبيقات غير المستخدمة في حالة انتظار: يتم تأجيل طلبات الشبكة، إيقاف المزامنة. إذا لم يتم استخدام التطبيق لعدة أيام، يضعه Android في Standby Bucket (نشط، working، frequent، rare).
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.