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. Для кожного запиту можна перевірити, чи був він уже виконаний або скасований, та прийняти рішення про повторне планування.
Важливо враховувати, що система не надає прямого Callback про успішність виконання фонового завдання — обробник сам повинен повідомити результат через властивості завдання. 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 не раніше ніж через 1 годину для BGProcessingTask та 15 хвилин для BGAppRefreshTask. Також важливо обробляти expirationHandler — якщо завдання не вкладається в ліміт, система викликає цей обробник для коректного завершення. Повторне планування повинно виконуватися всередині самого обробника, щоб підтримувати безперервний цикл фонової роботи.
Ще одне важливе обмеження стосується мережевих запитів. BGTaskScheduler не гарантує наявність активного мережевого з'єднання під час виконання завдання. Додаток повинен самостійно перевіряти доступність мережі через NWPathMonitor та відкладати обробку, якщо з'єднання відсутнє. Це відрізняється від Android JobScheduler, який вміє активувати завдання лише при підключенні до мережі певного типу. На практиці розробники часто комбінують BGTaskScheduler з фоновими URL-сесіями NSURLSession для надійного завантаження даних.
Починаючи з macOS Catalina BGTaskScheduler також доступний на Mac. Це дозволяє створювати кроссплатформні фонові завдання для UIKit-додатків, що запускаються на Apple Silicon. На watchOS фреймворк працює обмежено — доступні лише короткі BGAppRefreshTask для оновлення комплікацій та синхронізації даних з iPhone. Розробникам важливо враховувати платформні відмінності при плануванні фонової архітектури.
Для налагодження BGTaskScheduler Apple надає кілька інструментів. Команда e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] в lldb примусово запускає фонове завдання, ігноруючи системні обмеження. В Xcode доступний прапорець Simulate Background Fetch в меню Debug, який емулює коротке фонове оновлення. Для аналізу продуктивності використовується MetricKit — він збирає інформацію про частоту запусків, тривалість виконання та енергоспоживання кожного завдання. Ці дані допомагають оптимізувати частоту планування та вибирати правильний тип завдання.
На практиці BGTaskScheduler добре підходить для оновлення даних віджетів, синхронізації iCloud, обробки push-повідомлень з контентом та індексації пошуку Spotlight. Не підходить для відправки аналітики в реальному часі, чат-додатків або будь-яких завдань, що потребують негайного виконання.
Для поглибленого вивчення BGTaskScheduler Apple рекомендує офіційну документацію WWDC: сесія "Advances in Background Tasks" (2020) охоплює міграцію з застарілих API, а "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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також