BGTaskScheduler: ما هو، المهام الخلفية في iOS

المؤلف: IT Sectr نُشر: 2026-03-27 وقت القراءة: 8 دق

BGTaskScheduler هو إطار عمل من Apple لجدولة وتنفيذ المهام الخلفية في تطبيقات iOS 13 والإصدارات الأحدث. حل محل Background Fetch و performFetch القديمين، مقدماً API موحد للعمل مع العمليات الخلفية. وفقاً لـ Apple Developer Documentation, 2026، يتضمن الإطار نوعين من المهام: BGProcessingTask للعمليات الطويلة و BGAppRefreshTask للتحديثات القصيرة للمحتوى.

الخلاصة

  • BGTaskScheduler هو إطار عمل iOS 13+ لإدارة المهام الخلفية، حل محل Background Fetch القديم.
  • BGAppRefreshTask مهمة خلفية قصيرة تصل إلى 30 ثانية لتحديث المحتوى.
  • BGProcessingTask مهمة خلفية طويلة تصل إلى عدة دقائق للعمليات كثيفة الموارد.
  • التسجيل للمهام يتم في Info.plist عبر المعرفات وفي الكود عبر handleTasks.
  • النظام يحدد تلقائياً الوقت الأمثل لبدء المهام بناءً على سلوك المستخدم.

ما هو BGTaskScheduler؟

BGTaskScheduler هو إطار عمل نظام من Apple تم تقديمه في iOS 13 لإدارة تنفيذ المهام الخلفية بشكل مركزي. قبل ظهوره، كان المطورون يستخدمون UIApplication backgroundTasks و performFetch ومعالجة الأحداث في appDelegate، مما أدى إلى تجزئة الكود وسلوك غير متوقع.

يعمل الإطار على مبدأ الجدولة المؤجلة: التطبيق يسجل المهام بمعرفات فريدة، و iOS نفسه يحدد اللحظة المثلى لتنفيذها. يأخذ النظام في الاعتبار مستوى البطارية ونشاط المستخدم وحالة الشبكة وعوامل أخرى.

الإمكانيات الرئيسية تشمل العمل مع كل من العمليات الخلفية القصيرة والطويلة. على عكس AlarmManager في Android، لا يضمن BGTaskScheduler وقت تنفيذ محدد — يحتفظ النظام بالحق في تأخير المهمة إذا كانت الظروف غير مواتية.

كيف يعمل BGTaskScheduler في iOS؟

BGTaskScheduler يستخدم بنية قائمة على المعالجات (handlers). التطبيق يسجل معالجاً لكل نوع مهمة، والنظام يستدعيه عندما يحين الوقت المناسب. الإطار نفسه لا ينفذ المهمة مباشرة — بل يخطر التطبيق أن الوقت قد حان لتشغيلها.

عملية تسجيل المهمة

يبدأ التسجيل بإعلان معرف المهمة في Info.plist عبر مصفوفة BGTaskSchedulerPermittedIdentifiers. ثم في كود التطبيق، يتم استدعاء طريقة registerHandler(forTaskWithIdentifier:) مع إغلاق معالج.

swift
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. يحتوي الطلب على معرف المهمة وأقرب تاريخ ممكن للبدء. يحفظ النظام الطلب ويعالجه عندما يرى أن الظروف مناسبة.

swift
let request = BGAppRefreshTaskRequest(
    identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)

do {
    try BGTaskScheduler.shared.submit(request)
} catch {
    print("خطأ في الجدولة: \(error)")
}

أنواع المهام الخلفية في BGTaskScheduler

BGTaskScheduler يوفر نوعين رئيسيين من المهام، كل منهما مصمم لحالة استخدام خاصة به. اختيار النوع الصحيح يؤثر مباشرة على احتمالية نجاح تنفيذ المهمة من قبل النظام.

BGAppRefreshTask

BGAppRefreshTask مصممة للتحديثات القصيرة للمحتوى في الخلفية: تحميل بيانات جديدة، مزامنة مع الخادم، تحديث الودجات. وقت التنفيذ محدود بـ 30 ثانية، وبعدها ينهي النظام المهمة قسراً. هذا النوع من المهام يتم تنفيذه بتكرار أكبر من BGProcessingTask وله أولوية أعلى.

BGProcessingTask

BGProcessingTask مصممة للعمليات الأطول: معالجة ملفات الوسائط، فهرسة Core Data، إنشاء نسخ احتياطية. يمكن للمهمة أن تعمل حتى عدة دقائق، لكن النظام يبدأها بتكرار أقل وفقط في ظروف مواتية — متصلة بالطاقة، Wi-Fi مستقر، وحمل منخفض على الجهاز.

المعاملBGAppRefreshTaskBGProcessingTask
الحد الزمني30 ثانيةعدة دقائق
تكرار البدءعالٍمنخفض
الظروفأيطاقة + Wi-Fi
يتطلب طاقةلاموصى به
مثالتحديث التغذيةمعالجة فيديو

التسجيل والجدولة

التسجيل الصحيح هو شرط إلزامي لعمل BGTaskScheduler. إذا لم يتم تسجيل المهمة في Info.plist، سيتجاهل النظام أي طلب لتنفيذها.

التسجيل في Info.plist

يجب أن يتضمن ملف Info.plist مصفوفة BGTaskSchedulerPermittedIdentifiers مع قائمة من المعرفات النصية. يجب أن يكون كل معرف فريداً داخل التطبيق. توصي Apple باستخدام تدوين المجال العكسي.

xml
<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 لتحليل أداء المهام الخلفية — تجمع بيانات عن وقت التنفيذ واستهلاك الطاقة وتكرار البدء التي يمكن استخدامها للتحسين.

swift
// إلغاء مهمة محددة
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 و watchOS

بدءاً من 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. غير مناسب للتحليلات في الوقت الفعلي، تطبيقات الدردشة أو أي مهام تتطلب تنفيذاً فورياً.

موارد وتوثيق Apple

للدراسة المتعمقة لـ BGTaskScheduler، توصي Apple بتوثيق WWDC الرسمي: جلسة "Advances in Background Tasks" (2020) تغطي الترحيل من APIs القديمة، و "Background Tasks in Practice" (2021) تحتوي على حالات استخدام حقيقية. قسم Energy Efficiency Guide مفيد أيضاً، حيث يصف كيف يندمج الإطار في استراتيجية توفير الطاقة الشاملة لـ Apple. أمثلة الكود متاحة في المستودع الرسمي Apple Developer على GitHub مع مشاريع كاملة لـ iOS و macOS.

الأسئلة الشائعة

ما الفرق بين BGTaskScheduler و Background Fetch في iOS 12؟

Background Fetch كان محدوداً بمهمة خلفية واحدة لكل تطبيق ولم يكن لديه آلية أولويات. BGTaskScheduler يدعم مهاماً متعددة بأنواع مختلفة، ويوفر API موحد وإدارة طاقة تلقائية.

كم مهمة خلفية يمكن تسجيلها في BGTaskScheduler؟

Apple لا تضع حداً صريحاً على عدد المعرفات المسجلة، لكن عملياً يوصى باستخدام لا يزيد عن 5–10 مهام. العدد الأكبر يقلل من احتمالية تنفيذ كل مهمة محددة بسبب المنافسة على موارد النظام.

كيفية تصحيح تنفيذ BGTaskScheduler على جهاز حقيقي؟

للتصحيح، استخدم الأمر e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] في lldb. يبدأ قسراً مهمة متجاوزاً قيود النظام. علم Xcode Simulate Background Fetch في قائمة Debug متاح أيضاً.

هل يمكن لـ BGTaskScheduler تنفيذ مهمة إذا كان التطبيق مغلقاً؟

نعم، BGTaskScheduler يمكنه بدء عملية حتى إذا كان التطبيق قد أغلق قسراً من قبل المستخدم. ومع ذلك، قد يطبق النظام تأخيرات إضافية، وليس كل أنواع المهام تضمن التنفيذ في هذا السيناريو.

ماذا يحدث إذا لم تكتمل المهمة خلال الوقت المخصص؟

النظام يستدعي expirationHandler، مشيراً إلى المهمة أنها بحاجة للإنهاء. إذا تجاهل التطبيق هذه الإشارة واستمر في العمل، iOS ينهي العملية قسراً. بعد ذلك، قد يخفض النظام أولوية جميع المهام الخلفية للتطبيق.

الملخص

  • BGTaskScheduler هو إطار Apple الموحد لإدارة جميع المهام الخلفية في iOS 13+ و macOS Catalina+.
  • نوعان من المهام — BGAppRefreshTask حتى 30 ثانية و BGProcessingTask حتى عدة دقائق — تغطي سيناريوهات مختلفة للعمل الخلفي.
  • التسجيل إلزامي في مكانين: Info.plist (المعرفات) والكود (registerHandler).
  • الجدولة عبر submitTaskRequest مع earliestBeginDate — النظام يختار اللحظة المثلى للبدء.
  • ExpirationHandler إلزامي لمعالجة الإنهاء القسري للمهمة من قبل النظام.
  • القيود تشمل عدم ضمان التنفيذ، التحكم في استهلاك الطاقة والاعتماد على حالة الجهاز.
  • استخدم BGTaskScheduler لتحديث المحتوى والمزامنة والفهرسة، ولكن ليس للمهام في الوقت الفعلي.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا