BGTaskScheduler — فریمورک اپل برای برنامهریزی و اجرای وظایف پسزمینه در برنامههای iOS 13 و جدیدتر است. این فریمورک جایگزین Background Fetch و performFetch قدیمی شده و یک API یکپارچه برای کار با عملیاتهای پسزمینه ارائه میدهد. به گفته Apple Developer Documentation, 2026، این فریمورک شامل دو نوع وظیفه است: BGProcessingTask برای عملیاتهای طولانی و BGAppRefreshTask برای بهروزرسانیهای کوتاه محتوا.
نکات اصلی
BGTaskScheduler — فریمورک سیستمی اپل است که در iOS 13 معرفی شد و به صورت متمرکز اجرای وظایف پسزمینه را مدیریت میکند. قبل از ظهور آن، توسعهدهندگان از UIApplication backgroundTasks، performFetch و پردازش رویدادها در appDelegate استفاده میکردند که منجر به پراکندگی کد و رفتار غیرقابل پیشبینی میشد.
این فریمورک بر اساس اصل برنامهریزی تأخیری کار میکند: برنامه وظایف را با شناسههای منحصربهفرد ثبت میکند و iOS خود زمان بهینه اجرای آنها را تعیین میکند. سیستم سطح باتری، فعالیت کاربر، وضعیت شبکه و سایر عوامل را در نظر میگیرد.
قابلیتهای اصلی شامل کار با عملیاتهای کوتاه و طولانی پسزمینه است. برخلاف AlarmManager در اندروید، BGTaskScheduler زمان دقیق اجرا را تضمین نمیکند — سیستم این حق را برای خود محفوظ میدارد که در صورت نامساعد بودن شرایط، وظیفه را به تأخیر بیندازد.
BGTaskScheduler از معماری مبتنی بر handlerها استفاده میکند. برنامه برای هر نوع وظیفه یک handler ثبت میکند و سیستم وقتی زمان مناسب فرا رسد آن را فراخوانی میکند. خود فریمورک وظیفه را مستقیماً اجرا نمیکند — فقط به برنامه اطلاع میدهد که زمان راهاندازی آن فرا رسیده است.
ثبت با اعلام شناسه وظیفه در Info.plist از طریق آرایه BGTaskSchedulerPermittedIdentifiers آغاز میشود. سپس در کد برنامه متد registerHandler(forTaskWithIdentifier:) با closure-handler فراخوانی میشود.
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 برای بهروزرسانیهای کوتاه پسزمینه محتوا طراحی شده است: بارگیری دادههای جدید، همگامسازی با سرور، بهروزرسانی ویجتها. زمان اجرا به ۳۰ ثانیه محدود است و پس از اتمام آن، سیستم وظیفه را به اجبار خاتمه میدهد. این نوع وظایف بیشتر از BGProcessingTask اجرا میشود و اولویت بالاتری دارد.
BGProcessingTask برای عملیاتهای طولانیتر طراحی شده است: پردازش فایلهای چندرسانهای، ایندکسگذاری دادههای Core Data، ایجاد پشتیبانگیری. وظیفه میتواند تا چند دقیقه طول بکشد، اما سیستم آن را کمتر و فقط در شرایط مساعد — اتصال به برق، Wi-Fi پایدار و بار کم دستگاه — اجرا میکند.
| پارامتر | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| محدودیت زمانی | ۳۰ ثانیه | چند دقیقه |
| تناوب اجرا | بالا | کم |
| شرایط | هر شرایطی | برق + Wi-Fi |
| نیاز به برق | خیر | توصیه میشود |
| مثال | بهروزرسانی فید | پردازش ویدیو |
ثبتنام صحیح شرط اجباری کار BGTaskScheduler است. اگر وظیفه در Info.plist ثبت نشده باشد، سیستم هر درخواستی برای اجرای آن را نادیده میگیرد.
به فایل Info.plist یک آرایه BGTaskSchedulerPermittedIdentifiers با فهرست شناسههای متنی اضافه میشود. هر شناسه باید در محدوده برنامه منحصربهفرد باشد. اپل استفاده از نمادگذاری معکوس دامنه را توصیه میکند.
<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 را برای تحلیل عملکرد وظایف پسزمینه ارائه میدهد — این ابزار دادههایی درباره زمان اجرا، مصرف انرژی و تناوب اجرا جمعآوری میکند که میتوان از آنها برای بهینهسازی استفاده کرد.
// لغو وظیفه خاص
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 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 در دسترس است.
سوالات متداول
Background Fetch محدود به یک وظیفه پسزمینه در هر برنامه بود و مکانیزم اولویتبندی نداشت. BGTaskScheduler از وظایف متعدد با انواع مختلف پشتیبانی میکند، API یکپارچه و مدیریت خودکار مصرف انرژی ارائه میدهد.
اپل محدودیت صریحی برای تعداد شناسههای ثبت شده تعیین نمیکند، اما در عمل توصیه میشود از بیش از ۵–۱۰ وظیفه استفاده نشود. تعداد بیشتر به دلیل رقابت برای منابع سیستم، احتمال اجرای هر وظیفه خاص را کاهش میدهد.
برای اشکالزدایی از دستور e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] در lldb استفاده کنید. این دستور وظیفه را با دور زدن محدودیتهای سیستمی به اجبار اجرا میکند. همچنین پرچم Xcode Simulate Background Fetch در منوی Debug در دسترس است.
بله، BGTaskScheduler میتواند فرآیند را حتی اگر برنامه توسط کاربر به اجبار بسته شده باشد راهاندازی کند. با این حال، سیستم ممکن است تأخیرهای اضافی اعمال کند و همه انواع وظایف اجرا در این سناریو را تضمین نمیکنند.
سیستم expirationHandler را فراخوانی میکند و به وظیفه سیگنال خاتمه میدهد. اگر برنامه این سیگنال را نادیده گرفته و به کار ادامه دهد، iOS فرآیند را به اجبار خاتمه میدهد. پس از آن، سیستم ممکن است اولویت تمام وظایف پسزمینه برنامه را کاهش دهد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید