BGTaskScheduler — је Apple-ов фрејмворк за планирање и извршавање позадинских задатака у апликацијама за iOS 13 и новије. Замијенио је застарјеле Background Fetch и performFetch, пружајући јединствени АПИ за рад са позадинским операцијама. Према Apple Developer Documentation, 2026, фрејмворк укључује два типа задатака: BGProcessingTask за дуготрајне операције и BGAppRefreshTask за кратко ажурирање садржаја.
Главне тачке
BGTaskScheduler — је системски Apple-ов фрејмворк, представљен у iOS 13, који централизовано управља извршавањем позадинских задатака. Прије његовог појављивања, програмери су користили UIApplication backgroundTasks, performFetch и обраду догађаја у appDelegate, што је доводило до фрагментације кода и непредвидивог понашања.
Фрејмворк ради по принципу одложеног планирања: апликација региструје задатке са јединственим идентификаторима, а iOS сам одређује оптимални тренутак за њихово извршавање. Систем узима у обзир ниво батерије, активност корисника, стање мреже и друге факторе.
Основне могућности укључују рад и са кратким и са дуготрајним позадинским операцијама. За разлику од AlarmManager-а у Android-у, BGTaskScheduler не гарантује тачно вријеме извршавања — систем задржава право да одложи задатак ако су услови неповољни.
BGTaskScheduler користи архитектуру засновану на хендлерима. Апликација региструје хендлер за сваки тип задатка, а систем га позива када дође одговарајући тренутак. Сам фрејмворк не извршава задатак директно — само обавјештава апликацију да је вријеме да га покрене.
Регистрација почиње са декларисањем идентификатора задатка у 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 не раније од 1 сат за BGProcessingTask и 15 минута за BGAppRefreshTask. Такође је важно обрадити expirationHandler — ако се задатак не уклапа у лимит, систем позива овај хендлер за исправно завршавање. Поновно планирање треба да се обавља унутар самог хендлера како би се одржао континуирани циклус позадинског рада.
Још једно важно ограничење односи се на мрежне захтјеве. BGTaskScheduler не гарантује постојање активне мрежне везе током извршавања задатка. Апликација мора самостално провјеравати доступност мреже преко NWPathMonitor-а и одложити обраду ако веза не постоји. Ово се разликује од Android JobScheduler-а који може активирати задатак само при повезивању на мрежу одређеног типа. У пракси, програмери често комбинују BGTaskScheduler са позадинским УРЛ сесијама 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође