BGTaskScheduler: چیست، وظایف پس‌زمینه iOS

نویسنده: IT Sectr منتشر شده: 2026-03-27 زمان مطالعه: 8 دقیقه

BGTaskScheduler — فریم‌ورک اپل برای برنامه‌ریزی و اجرای وظایف پس‌زمینه در برنامه‌های iOS 13 و جدیدتر است. این فریم‌ورک جایگزین Background Fetch و performFetch قدیمی شده و یک API یکپارچه برای کار با عملیات‌های پس‌زمینه ارائه می‌دهد. به گفته Apple Developer Documentation, 2026، این فریم‌ورک شامل دو نوع وظیفه است: BGProcessingTask برای عملیات‌های طولانی و BGAppRefreshTask برای به‌روزرسانی‌های کوتاه محتوا.

نکات اصلی

  • BGTaskScheduler — فریم‌ورک iOS 13+ برای مدیریت وظایف پس‌زمینه که جایگزین Background Fetch قدیمی شده است.
  • BGAppRefreshTask — وظیفه کوتاه پس‌زمینه تا ۳۰ ثانیه برای به‌روزرسانی محتوا.
  • BGProcessingTask — وظیفه طولانی پس‌زمینه تا چند دقیقه برای عملیات‌های سنگین.
  • ثبت‌نام وظایف در Info.plist از طریق شناسه‌ها و در کد از طریق handleTasks انجام می‌شود.
  • سیستم به طور خودکار زمان بهینه اجرای وظایف را بر اساس رفتار کاربر تعیین می‌کند.

BGTaskScheduler چیست؟

BGTaskScheduler — فریم‌ورک سیستمی اپل است که در iOS 13 معرفی شد و به صورت متمرکز اجرای وظایف پس‌زمینه را مدیریت می‌کند. قبل از ظهور آن، توسعه‌دهندگان از UIApplication backgroundTasks، performFetch و پردازش رویدادها در appDelegate استفاده می‌کردند که منجر به پراکندگی کد و رفتار غیرقابل پیش‌بینی می‌شد.

این فریم‌ورک بر اساس اصل برنامه‌ریزی تأخیری کار می‌کند: برنامه وظایف را با شناسه‌های منحصربه‌فرد ثبت می‌کند و iOS خود زمان بهینه اجرای آنها را تعیین می‌کند. سیستم سطح باتری، فعالیت کاربر، وضعیت شبکه و سایر عوامل را در نظر می‌گیرد.

قابلیت‌های اصلی شامل کار با عملیات‌های کوتاه و طولانی پس‌زمینه است. برخلاف AlarmManager در اندروید، BGTaskScheduler زمان دقیق اجرا را تضمین نمی‌کند — سیستم این حق را برای خود محفوظ می‌دارد که در صورت نامساعد بودن شرایط، وظیفه را به تأخیر بیندازد.

BGTaskScheduler در iOS چگونه کار می‌کند؟

BGTaskScheduler از معماری مبتنی بر handlerها استفاده می‌کند. برنامه برای هر نوع وظیفه یک handler ثبت می‌کند و سیستم وقتی زمان مناسب فرا رسد آن را فراخوانی می‌کند. خود فریم‌ورک وظیفه را مستقیماً اجرا نمی‌کند — فقط به برنامه اطلاع می‌دهد که زمان راه‌اندازی آن فرا رسیده است.

فرآیند ثبت وظیفه

ثبت با اعلام شناسه وظیفه در Info.plist از طریق آرایه BGTaskSchedulerPermittedIdentifiers آغاز می‌شود. سپس در کد برنامه متد registerHandler(forTaskWithIdentifier:) با closure-handler فراخوانی می‌شود.

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 برای به‌روزرسانی‌های کوتاه پس‌زمینه محتوا طراحی شده است: بارگیری داده‌های جدید، همگام‌سازی با سرور، به‌روزرسانی ویجت‌ها. زمان اجرا به ۳۰ ثانیه محدود است و پس از اتمام آن، سیستم وظیفه را به اجبار خاتمه می‌دهد. این نوع وظایف بیشتر از BGProcessingTask اجرا می‌شود و اولویت بالاتری دارد.

BGProcessingTask

BGProcessingTask برای عملیات‌های طولانی‌تر طراحی شده است: پردازش فایل‌های چندرسانه‌ای، ایندکس‌گذاری داده‌های Core Data، ایجاد پشتیبان‌گیری. وظیفه می‌تواند تا چند دقیقه طول بکشد، اما سیستم آن را کمتر و فقط در شرایط مساعد — اتصال به برق، Wi-Fi پایدار و بار کم دستگاه — اجرا می‌کند.

پارامترBGAppRefreshTaskBGProcessingTask
محدودیت زمانی۳۰ ثانیهچند دقیقه
تناوب اجرابالاکم
شرایطهر شرایطیبرق + Wi-Fi
نیاز به برقخیرتوصیه می‌شود
مثالبه‌روزرسانی فیدپردازش ویدیو

ثبت‌نام و برنامه‌ریزی وظایف

ثبت‌نام صحیح شرط اجباری کار BGTaskScheduler است. اگر وظیفه در Info.plist ثبت نشده باشد، سیستم هر درخواستی برای اجرای آن را نادیده می‌گیرد.

ثبت در Info.plist

به فایل Info.plist یک آرایه BGTaskSchedulerPermittedIdentifiers با فهرست شناسه‌های متنی اضافه می‌شود. هر شناسه باید در محدوده برنامه منحصربه‌فرد باشد. اپل استفاده از نمادگذاری معکوس دامنه را توصیه می‌کند.

xml
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
    <string>com.example.app.refresh</string>
    <string>com.example.app.processing</string>
</array>

برنامه‌ریزی و لغو

برای برنامه‌ریزی از متد submitTaskRequest استفاده می‌شود. اگر وظیفه دیگر مورد نیاز نیست، می‌توان آن را از طریق cancelTaskRequest یا cancelAllTaskRequests لغو کرد. سیستم همچنین هنگام حذف برنامه یا بازنشانی داده‌ها وظایف را به طور خودکار لغو می‌کند.

نظارت بر وضعیت وظایف

BGTaskScheduler امکان پیگیری وضعیت وظایف برنامه‌ریزی شده را از طریق getPendingTaskRequests فراهم می‌کند. این متد فهرستی از تمام درخواست‌های فعال را با اطلاعات نوع، شناسه و earliestBeginDate برمی‌گرداند. برای هر درخواست می‌توان بررسی کرد که آیا قبلاً اجرا یا لغو شده است و درباره برنامه‌ریزی مجدد تصمیم گرفت.

توجه به این نکته مهم است که سیستم بازخوان مستقیم (Callback) درباره موفقیت اجرای وظیفه پس‌زمینه ارائه نمی‌دهد — handler خود باید نتیجه را از طریق ویژگی‌های task گزارش دهد. setTaskCompleted به شما امکان می‌دهد وظیفه را با موفقیت انجام شده علامت‌گذاری کنید، پس از آن سیستم می‌تواند وظیفه برنامه‌ریزی شده بعدی از این نوع را اجرا کند. اگر وظیفه setTaskCompleted را فراخوانی نکند، سیستم آن را پس از اتمام زمان یا در خاتمه اجباری به عنوان پایان‌یافته در نظر می‌گیرد.

برای تشخیص مشکلات توصیه می‌شود از OSLog در handler استفاده کرده و لاگ‌ها را از طریق Console.app در مک مشاهده کنید. اپل همچنین ابزار MetricKit را برای تحلیل عملکرد وظایف پس‌زمینه ارائه می‌دهد — این ابزار داده‌هایی درباره زمان اجرا، مصرف انرژی و تناوب اجرا جمع‌آوری می‌کند که می‌توان از آنها برای بهینه‌سازی استفاده کرد.

swift
// لغو وظیفه خاص
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)

// لغو تمام وظایف
BGTaskScheduler.shared.cancelAllTaskRequests()

// بررسی وظایف برنامه‌ریزی شده
BGTaskScheduler.shared.getPendingTaskRequests { requests in
    print("\(requests.count) وظیفه برنامه‌ریزی شد")
}

محدودیت‌ها و توصیه‌ها

BGTaskScheduler محدودیت‌های سختگیرانه‌ای بر کار پس‌زمینه اعمال می‌کند. سیستم می‌تواند وظیفه را برای مدت نامحدودی به تأخیر بیندازد اگر شرایط نامساعد باشد. توسعه‌دهنده باید بداند که این فریم‌ورک برای وظایف بلادرنگ طراحی نشده است.

از جمله محدودیت‌های کلیدی: سیستم اجرای وظیفه در زمان مشخص را تضمین نمی‌کند، حداکثر تعداد وظایف همزمان محدود است و مصرف انرژی به شدت کنترل می‌شود. اجرای چند وظیفه پشت سر هم می‌تواند منجر به ادغام یا لغو آنها شود.

برای افزایش احتمال اجرا توصیه می‌شود earliestBeginDate را زودتر از ۱ ساعت برای BGProcessingTask و ۱۵ دقیقه برای BGAppRefreshTask تنظیم نکنید. همچنین پردازش expirationHandler مهم است — اگر وظیفه در محدوده زمانی قرار نگیرد، سیستم این handler را برای خاتمه صحیح فراخوانی می‌کند. برنامه‌ریزی مجدد باید در داخل خود handler انجام شود تا چرخه مداوم کار پس‌زمینه حفظ شود.

محدودیت مهم دیگر مربوط به درخواست‌های شبکه است. BGTaskScheduler وجود اتصال شبکه فعال در حین اجرای وظیفه را تضمین نمی‌کند. برنامه باید به طور مستقل دسترسی به شبکه را از طریق NWPathMonitor بررسی کرده و در صورت عدم اتصال، پردازش را به تأخیر بیندازد. این تفاوت با Android JobScheduler دارد که می‌تواند وظیفه را فقط هنگام اتصال به شبکه از نوع خاص فعال کند. در عمل، توسعه‌دهندگان اغلب BGTaskScheduler را با جلسات URL پس‌زمینه NSURLSession برای بارگیری قابل اعتماد داده‌ها ترکیب می‌کنند.

سازگاری با macOS و watchOS

از macOS Catalina به بعد BGTaskScheduler در مک نیز در دسترس است. این امکان ایجاد وظایف پس‌زمینه بین‌پلتفرمی برای برنامه‌های UIKit اجرا شده روی Apple Silicon را فراهم می‌کند. در watchOS فریم‌ورک به صورت محدود کار می‌کند — فقط BGAppRefreshTask کوتاه برای به‌روزرسانی complication و همگام‌سازی داده‌ها با iPhone در دسترس است. توسعه‌دهندگان باید هنگام برنامه‌ریزی معماری پس‌زمینه تفاوت‌های پلتفرمی را در نظر بگیرند.

ابزارهای اشکال‌زدایی و تشخیص

برای اشکال‌زدایی BGTaskScheduler اپل چندین ابزار ارائه می‌دهد. دستور e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] در lldb به اجبار وظیفه پس‌زمینه را بدون در نظر گرفتن محدودیت‌های سیستمی اجرا می‌کند. در Xcode پرچم Simulate Background Fetch در منوی Debug در دسترس است که یک به‌روزرسانی کوتاه پس‌زمینه را شبیه‌سازی می‌کند. برای تحلیل عملکرد از MetricKit استفاده می‌شود — این ابزار اطلاعاتی درباره تناوب اجرا، مدت زمان و مصرف انرژی هر وظیفه جمع‌آوری می‌کند. این داده‌ها به بهینه‌سازی تناوب برنامه‌ریزی و انتخاب نوع مناسب وظیفه کمک می‌کنند.

در عمل BGTaskScheduler برای به‌روزرسانی داده‌های ویجت‌ها، همگام‌سازی iCloud، پردازش اعلان‌های push با محتوا و ایندکس‌گذاری جستجوی Spotlight مناسب است. برای ارسال تحلیل بلادرنگ، برنامه‌های چت یا هر وظیفه‌ای که نیاز به اجرای فوری دارد مناسب نیست.

منابع و مستندات اپل

برای مطالعه عمیق BGTaskScheduler اپل مستندات رسمی WWDC را توصیه می‌کند: جلسه «Advances in Background Tasks» (2020) مهاجرت از APIهای قدیمی را پوشش می‌دهد و «Background Tasks in Practice» (2021) شامل موارد استفاده واقعی است. همچنین بخش Energy Efficiency Guide مفید است که نحوه تطبیق فریم‌ورک با استراتژی کلی صرفه‌جویی انرژی اپل را توضیح می‌دهد. نمونه‌های کد در مخزن رسمی Apple Developer در GitHub با پروژه‌های کامل برای iOS و macOS در دسترس است.

سوالات متداول

BGTaskScheduler چه تفاوتی با Background Fetch در iOS 12 دارد؟

Background Fetch محدود به یک وظیفه پس‌زمینه در هر برنامه بود و مکانیزم اولویت‌بندی نداشت. BGTaskScheduler از وظایف متعدد با انواع مختلف پشتیبانی می‌کند، API یکپارچه و مدیریت خودکار مصرف انرژی ارائه می‌دهد.

چند وظیفه پس‌زمینه می‌توان در BGTaskScheduler ثبت کرد؟

اپل محدودیت صریحی برای تعداد شناسه‌های ثبت شده تعیین نمی‌کند، اما در عمل توصیه می‌شود از بیش از ۵–۱۰ وظیفه استفاده نشود. تعداد بیشتر به دلیل رقابت برای منابع سیستم، احتمال اجرای هر وظیفه خاص را کاهش می‌دهد.

چگونه اجرای BGTaskScheduler را روی دستگاه واقعی اشکال‌زدایی کنیم؟

برای اشکال‌زدایی از دستور e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] در lldb استفاده کنید. این دستور وظیفه را با دور زدن محدودیت‌های سیستمی به اجبار اجرا می‌کند. همچنین پرچم Xcode Simulate Background Fetch در منوی Debug در دسترس است.

آیا BGTaskScheduler می‌تواند وظیفه را در صورت بسته بودن برنامه اجرا کند؟

بله، BGTaskScheduler می‌تواند فرآیند را حتی اگر برنامه توسط کاربر به اجبار بسته شده باشد راه‌اندازی کند. با این حال، سیستم ممکن است تأخیرهای اضافی اعمال کند و همه انواع وظایف اجرا در این سناریو را تضمین نمی‌کنند.

اگر وظیفه در زمان تعیین شده تکمیل نشود چه اتفاقی می‌افتد؟

سیستم expirationHandler را فراخوانی می‌کند و به وظیفه سیگنال خاتمه می‌دهد. اگر برنامه این سیگنال را نادیده گرفته و به کار ادامه دهد، iOS فرآیند را به اجبار خاتمه می‌دهد. پس از آن، سیستم ممکن است اولویت تمام وظایف پس‌زمینه برنامه را کاهش دهد.

خلاصه

  • BGTaskScheduler — فریم‌ورک یکپارچه اپل برای مدیریت تمام وظایف پس‌زمینه در iOS 13+ و macOS Catalina+.
  • دو نوع وظیفه — BGAppRefreshTask تا ۳۰ ثانیه و BGProcessingTask تا چند دقیقه — سناریوهای مختلف کار پس‌زمینه را پوشش می‌دهند.
  • ثبت‌نام در دو مکان الزامی است: Info.plist (شناسه‌ها) و کد (registerHandler).
  • برنامه‌ریزی از طریق submitTaskRequest با earliestBeginDate — سیستم خود زمان بهینه شروع را انتخاب می‌کند.
  • ExpirationHandler برای پردازش خاتمه اجباری وظیفه توسط سیستم الزامی است.
  • محدودیت‌ها شامل عدم تضمین اجرا، کنترل مصرف انرژی و وابستگی به وضعیت دستگاه است.
  • استفاده کنید BGTaskScheduler را برای به‌روزرسانی محتوا، همگام‌سازی و ایندکس‌گذاری، اما نه برای وظایف بلادرنگ.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید