BGTaskScheduler هو إطار عمل من Apple لجدولة وتنفيذ المهام الخلفية في تطبيقات iOS 13 والإصدارات الأحدث. حل محل Background Fetch و performFetch القديمين، مقدماً API موحد للعمل مع العمليات الخلفية. وفقاً لـ Apple Developer Documentation, 2026، يتضمن الإطار نوعين من المهام: BGProcessingTask للعمليات الطويلة و BGAppRefreshTask للتحديثات القصيرة للمحتوى.
الخلاصة
BGTaskScheduler هو إطار عمل نظام من Apple تم تقديمه في iOS 13 لإدارة تنفيذ المهام الخلفية بشكل مركزي. قبل ظهوره، كان المطورون يستخدمون UIApplication backgroundTasks و performFetch ومعالجة الأحداث في appDelegate، مما أدى إلى تجزئة الكود وسلوك غير متوقع.
يعمل الإطار على مبدأ الجدولة المؤجلة: التطبيق يسجل المهام بمعرفات فريدة، و iOS نفسه يحدد اللحظة المثلى لتنفيذها. يأخذ النظام في الاعتبار مستوى البطارية ونشاط المستخدم وحالة الشبكة وعوامل أخرى.
الإمكانيات الرئيسية تشمل العمل مع كل من العمليات الخلفية القصيرة والطويلة. على عكس AlarmManager في Android، لا يضمن BGTaskScheduler وقت تنفيذ محدد — يحتفظ النظام بالحق في تأخير المهمة إذا كانت الظروف غير مواتية.
BGTaskScheduler يستخدم بنية قائمة على المعالجات (handlers). التطبيق يسجل معالجاً لكل نوع مهمة، والنظام يستدعيه عندما يحين الوقت المناسب. الإطار نفسه لا ينفذ المهمة مباشرة — بل يخطر التطبيق أن الوقت قد حان لتشغيلها.
يبدأ التسجيل بإعلان معرف المهمة في Info.plist عبر مصفوفة BGTaskSchedulerPermittedIdentifiers. ثم في كود التطبيق، يتم استدعاء طريقة registerHandler(forTaskWithIdentifier:) مع إغلاق معالج.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// يتم استدعاؤه عند الإنهاء القسري
}
processBackgroundTask(task as! BGAppRefreshTask)
}
بعد التسجيل، يجب على التطبيق طلب تنفيذ المهمة صراحة عبر submitTaskRequest. يحتوي الطلب على معرف المهمة وأقرب تاريخ ممكن للبدء. يحفظ النظام الطلب ويعالجه عندما يرى أن الظروف مناسبة.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("خطأ في الجدولة: \(error)")
}
BGTaskScheduler يوفر نوعين رئيسيين من المهام، كل منهما مصمم لحالة استخدام خاصة به. اختيار النوع الصحيح يؤثر مباشرة على احتمالية نجاح تنفيذ المهمة من قبل النظام.
BGAppRefreshTask مصممة للتحديثات القصيرة للمحتوى في الخلفية: تحميل بيانات جديدة، مزامنة مع الخادم، تحديث الودجات. وقت التنفيذ محدود بـ 30 ثانية، وبعدها ينهي النظام المهمة قسراً. هذا النوع من المهام يتم تنفيذه بتكرار أكبر من BGProcessingTask وله أولوية أعلى.
BGProcessingTask مصممة للعمليات الأطول: معالجة ملفات الوسائط، فهرسة Core Data، إنشاء نسخ احتياطية. يمكن للمهمة أن تعمل حتى عدة دقائق، لكن النظام يبدأها بتكرار أقل وفقط في ظروف مواتية — متصلة بالطاقة، Wi-Fi مستقر، وحمل منخفض على الجهاز.
| المعامل | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| الحد الزمني | 30 ثانية | عدة دقائق |
| تكرار البدء | عالٍ | منخفض |
| الظروف | أي | طاقة + Wi-Fi |
| يتطلب طاقة | لا | موصى به |
| مثال | تحديث التغذية | معالجة فيديو |
التسجيل الصحيح هو شرط إلزامي لعمل BGTaskScheduler. إذا لم يتم تسجيل المهمة في Info.plist، سيتجاهل النظام أي طلب لتنفيذها.
يجب أن يتضمن ملف Info.plist مصفوفة BGTaskSchedulerPermittedIdentifiers مع قائمة من المعرفات النصية. يجب أن يكون كل معرف فريداً داخل التطبيق. توصي Apple باستخدام تدوين المجال العكسي.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
لجدولة مهمة، استخدم طريقة submitTaskRequest. إذا لم تعد المهمة مطلوبة، يمكن إلغاؤها عبر cancelTaskRequest أو cancelAllTaskRequests. النظام أيضاً يلغي المهام تلقائياً عند حذف التطبيق أو إعادة تعيين البيانات.
يوفر BGTaskScheduler إمكانية تتبع حالة المهام المجدولة عبر getPendingTaskRequests. تعيد هذه الطريقة قائمة بجميع الطلبات النشطة مع معلومات عن نوعها ومعرفها و earliestBeginDate. لكل طلب، يمكن التحقق مما إذا كان قد اكتمل أو ألغي، واتخاذ قرار بشأن إعادة الجدولة.
من المهم ملاحظة أن النظام لا يوفر استدعاء مباشراً حول نجاح المهمة الخلفية — يجب على المعالج نفسه الإبلاغ عن النتيجة عبر خصائص المهمة. setTaskCompleted يسمح بوضع علامة على المهمة كمكتملة بنجاح، وبعد ذلك يمكن للنظام بدء المهمة المجدولة التالية من هذا النوع. إذا لم تستدع المهمة setTaskCompleted، يعتبرها النظام مكتملة عند انتهاء المهلة أو الإنهاء القسري.
للتشخيص، يوصى باستخدام OSLog في المعالج وعرض السجلات عبر Console.app على Mac. توفر Apple أيضاً أداة MetricKit لتحليل أداء المهام الخلفية — تجمع بيانات عن وقت التنفيذ واستهلاك الطاقة وتكرار البدء التي يمكن استخدامها للتحسين.
// إلغاء مهمة محددة
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// إلغاء جميع المهام
BGTaskScheduler.shared.cancelAllTaskRequests()
// التحقق من المهام المجدولة
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) مهام مجدولة")
}
BGTaskScheduler يفرض قيوداً صارمة على العمل الخلفي. قد يؤخر النظام المهمة لفترة غير محددة إذا كانت الظروف غير مواتية. يجب على المطورين فهم أن الإطار غير مخصص للمهام في الوقت الفعلي.
القيود الرئيسية تشمل: النظام لا يضمن تنفيذ المهمة في الوقت المحدد، الحد الأقصى لعدد المهام المتزامنة محدود، و استهلاك الطاقة يتم التحكم فيه بدقة. تشغيل عدة مهام متتالية قد يؤدي إلى دمجها أو إلغائها.
لزيادة احتمالية التنفيذ، يوصى بتعيين earliestBeginDate ليس قبل ساعة واحدة لـ BGProcessingTask و 15 دقيقة لـ BGAppRefreshTask. من المهم أيضاً معالجة expirationHandler — إذا لم تلتزم المهمة بحدها الزمني، يستدعي النظام هذا المعالج للإنهاء المناسب. يجب أن تتم إعادة الجدولة داخل المعالج نفسه للحفاظ على دورة عمل خلفية مستمرة.
قيود مهمة أخرى تتعلق بـ طلبات الشبكة. لا يضمن BGTaskScheduler اتصال شبكة نشط أثناء تنفيذ المهمة. يجب على التطبيق التحقق بشكل مستقل من توفر الشبكة عبر NWPathMonitor وتأجيل المعالجة إذا كان الاتصال غائباً. هذا يختلف عن Android JobScheduler الذي يمكنه تفعيل مهمة فقط عند الاتصال بنوع معين من الشبكة. في الممارسة العملية، غالباً ما يجمع المطورون بين BGTaskScheduler وجلسات URL الخلفية NSURLSession لتحميل بيانات موثوق.
بدءاً من macOS Catalina، BGTaskScheduler متاح أيضاً على Mac. هذا يسمح بإنشاء مهام خلفية عبر المنصات لتطبيقات UIKit التي تعمل على Apple Silicon. على watchOS، الإطار له وظائف محدودة — فقط BGAppRefreshTask قصيرة متاحة لتحديث التعقيدات ومزامنة البيانات مع iPhone. يجب على المطورين مراعاة الاختلافات بين المنصات عند تخطيط البنية الخلفية.
توفر Apple عدة أدوات لتصحيح BGTaskScheduler. الأمر e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] في lldb يبدأ قسراً مهمة خلفية، متجاوزاً قيود النظام. في Xcode، يوجد علم Simulate Background Fetch في قائمة Debug يحاكي تحديثاً خلفياً قصيراً. يستخدم MetricKit لتحليل الأداء — يجمع معلومات عن تكرار البدء ومدة التنفيذ واستهلاك الطاقة لكل مهمة. هذه البيانات تساعد في تحسين تردد الجدولة واختيار نوع المهمة الصحيح.
عملياً، BGTaskScheduler مناسب لتحديث بيانات الودجات، مزامنة iCloud، معالجة إشعارات الدفع مع المحتوى وفهرسة بحث Spotlight. غير مناسب للتحليلات في الوقت الفعلي، تطبيقات الدردشة أو أي مهام تتطلب تنفيذاً فورياً.
للدراسة المتعمقة لـ BGTaskScheduler، توصي Apple بتوثيق WWDC الرسمي: جلسة "Advances in Background Tasks" (2020) تغطي الترحيل من APIs القديمة، و "Background Tasks in Practice" (2021) تحتوي على حالات استخدام حقيقية. قسم Energy Efficiency Guide مفيد أيضاً، حيث يصف كيف يندمج الإطار في استراتيجية توفير الطاقة الشاملة لـ Apple. أمثلة الكود متاحة في المستودع الرسمي Apple Developer على GitHub مع مشاريع كاملة لـ iOS و macOS.
الأسئلة الشائعة
Background Fetch كان محدوداً بمهمة خلفية واحدة لكل تطبيق ولم يكن لديه آلية أولويات. BGTaskScheduler يدعم مهاماً متعددة بأنواع مختلفة، ويوفر API موحد وإدارة طاقة تلقائية.
Apple لا تضع حداً صريحاً على عدد المعرفات المسجلة، لكن عملياً يوصى باستخدام لا يزيد عن 5–10 مهام. العدد الأكبر يقلل من احتمالية تنفيذ كل مهمة محددة بسبب المنافسة على موارد النظام.
للتصحيح، استخدم الأمر e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] في lldb. يبدأ قسراً مهمة متجاوزاً قيود النظام. علم Xcode Simulate Background Fetch في قائمة Debug متاح أيضاً.
نعم، BGTaskScheduler يمكنه بدء عملية حتى إذا كان التطبيق قد أغلق قسراً من قبل المستخدم. ومع ذلك، قد يطبق النظام تأخيرات إضافية، وليس كل أنواع المهام تضمن التنفيذ في هذا السيناريو.
النظام يستدعي expirationHandler، مشيراً إلى المهمة أنها بحاجة للإنهاء. إذا تجاهل التطبيق هذه الإشارة واستمر في العمل، iOS ينهي العملية قسراً. بعد ذلك، قد يخفض النظام أولوية جميع المهام الخلفية للتطبيق.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا