BGTaskScheduler — je framework od Apple pro plánování a provádění úloh na pozadí v aplikacích pro iOS 13 a novější. Nahradil zastaralé Background Fetch a performFetch a poskytuje jednotné API pro práci s operacemi na pozadí. Podle Apple Developer Documentation, 2026 framework zahrnuje dva typy úkolů: BGProcessingTask pro dlouhé operace a BGAppRefreshTask pro krátké aktualizace obsahu.
Hlavní body
BGTaskScheduler — je systémový framework od Apple, představený v iOS 13, který centrálně spravuje provádění úloh na pozadí. Před jeho příchodem vývojáři používali UIApplication backgroundTasks, performFetch a zpracování událostí v appDelegate, což vedlo k fragmentaci kódu a nepředvídatelnému chování.
Framework funguje na principu odloženého plánování: aplikace registruje úkoly s jedinečnými identifikátory a iOS sám určuje optimální okamžik pro jejich provedení. Systém bere v úvahu úroveň baterie, aktivitu uživatele, stav sítě a další faktory.
Hlavní možnosti zahrnují práci s krátkými i dlouhými operacemi na pozadí. Na rozdíl od AlarmManager v Androidu, BGTaskScheduler nezaručuje přesný čas provedení — systém si vyhrazuje právo úkol odložit, pokud jsou podmínky nepříznivé.
BGTaskScheduler používá architekturu založenou na handlerech. Aplikace registruje handler pro každý typ úkolu a systém ho zavolá, když nastane vhodný okamžik. Samotný framework neprovádí úkol přímo — pouze upozorní aplikaci, že je čas jej spustit.
Registrace začíná deklarováním identifikátoru úkolu v Info.plist přes pole BGTaskSchedulerPermittedIdentifiers. Poté je v kódu aplikace volána metoda registerHandler(forTaskWithIdentifier:) s handler-closure.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// voláno při vynuceném ukončení
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Po registraci musí aplikace výslovně požádat o provedení úkolu pomocí submitTaskRequest. Žádost obsahuje identifikátor úkolu a datum nejdříve možného spuštění. Systém žádost uloží a zpracuje ji, když uzná podmínky za vhodné.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Chyba plánování: \(error)")
}
BGTaskScheduler poskytuje dva hlavní typy úkolů, z nichž každý je určen pro svůj vlastní scénář použití. Výběr správného typu přímo ovlivňuje pravděpodobnost úspěšného provedení úkolu systémem.
BGAppRefreshTask je určena pro krátké aktualizace obsahu na pozadí: načítání nových dat, synchronizace se serverem, aktualizace widgetů. Doba provedení je omezena na 30 sekund, po jejichž uplynutí systém úkol vynuceně ukončí. Tento typ úkolů je prováděn častěji než BGProcessingTask a má vyšší prioritu.
BGProcessingTask je určena pro delší operace: zpracování multimediálních souborů, indexování dat Core Data, vytváření záloh. Úkol může trvat až několik minut, ale systém jej spouští méně často a pouze za příznivých podmínek — připojení k napájení, stabilní Wi-Fi a nízké zatížení zařízení.
| Parametr | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Časový limit | 30 sekund | několik minut |
| Frekvence spouštění | vysoká | nízká |
| Podmínky | jakékoli | napájení + Wi-Fi |
| Vyžaduje napájení | ne | doporučeno |
| Příklad | aktualizace kanálu | zpracování videa |
Správná registrace — je povinnou podmínkou fungování BGTaskScheduler. Pokud úkol není zaregistrován v Info.plist, systém ignoruje jakýkoli požadavek na jeho provedení.
Do souboru Info.plist se přidá pole BGTaskSchedulerPermittedIdentifiers se seznamem textových identifikátorů. Každý identifikátor musí být v rámci aplikace jedinečný. Apple doporučuje používat reverzní doménovou notaci.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Pro plánování se používá metoda submitTaskRequest. Pokud úkol již není potřeba, lze jej zrušit pomocí cancelTaskRequest nebo cancelAllTaskRequests. Systém automaticky ruší úkoly při smazání aplikace nebo resetování dat.
BGTaskScheduler umožňuje sledovat stav naplánovaných úkolů prostřednictvím getPendingTaskRequests. Tato metoda vrací seznam všech aktivních požadavků s informacemi o jejich typu, identifikátoru a earliestBeginDate. U každého požadavku lze zkontrolovat, zda byl již proveden nebo zrušen, a rozhodnout o opětovném naplánování.
Je důležité si uvědomit, že systém neposkytuje přímé Callback o úspěšnosti provedení úkolu na pozadí — handler sám musí ohlásit výsledek prostřednictvím vlastností úkolu. setTaskCompleted umožňuje označit úkol jako úspěšně dokončený, poté může systém spustit další naplánovaný úkol tohoto typu. Pokud úkol nezavolá setTaskCompleted, systém jej považuje za dokončený po uplynutí času nebo při vynuceném ukončení.
Pro diagnostiku problémů se doporučuje používat OSLog v handleru a prohlížet protokoly přes Console.app na Macu. Apple také poskytuje nástroj MetricKit pro analýzu výkonu úloh na pozadí — shromažďuje údaje o době provádění, spotřebě energie a frekvenci spouštění, které lze použít k optimalizaci.
// Zrušení konkrétního úkolu
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Zrušení všech úkolů
BGTaskScheduler.shared.cancelAllTaskRequests()
// Kontrola naplánovaných úkolů
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("Naplánováno \(requests.count) úkolů")
}
BGTaskScheduler ukládá přísná omezení na práci na pozadí. Systém může úkol odložit na neurčito, pokud jsou podmínky nepříznivé. Vývojář musí pochopit, že framework není určen pro úkoly v reálném čase.
Mezi klíčová omezení patří: systém nezaručuje provedení úkolu v uvedeném čase, maximální počet současných úkolů je omezen a spotřeba energie je přísně kontrolována. Spuštění několika úkolů za sebou může vést k jejich sloučení nebo zrušení.
Pro zvýšení pravděpodobnosti provedení se doporučuje nastavit earliestBeginDate ne dříve než 1 hodinu pro BGProcessingTask a 15 minut pro BGAppRefreshTask. Důležité je také zpracovat expirationHandler — pokud se úkol nevejde do limitu, systém zavolá tento handler pro správné ukončení. Opětovné plánování by mělo probíhat uvnitř samotného handleru pro udržení nepřetržitého cyklu práce na pozadí.
Další důležité omezení se týká síťových požadavků. BGTaskScheduler nezaručuje aktivní síťové připojení během provádění úkolu. Aplikace musí sama kontrolovat dostupnost sítě přes NWPathMonitor a odložit zpracování, pokud připojení chybí. To se liší od Android JobScheduler, který dokáže aktivovat úkol pouze při připojení k síti určitého typu. V praxi vývojáři často kombinují BGTaskScheduler s relacemi URL na pozadí NSURLSession pro spolehlivé načítání dat.
Počínaje macOS Catalina je BGTaskScheduler k dispozici také na Macu. To umožňuje vytvářet multiplatformní úlohy na pozadí pro UIKit aplikace běžící na Apple Silicon. Na watchOS framework funguje omezeně — jsou k dispozici pouze krátké BGAppRefreshTask pro aktualizaci komplikací a synchronizaci dat s iPhonem. Vývojáři by měli brát v úvahu rozdíly platforem při plánování architektury na pozadí.
Pro ladění BGTaskScheduler poskytuje Apple několik nástrojů. Příkaz e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] v lldb vynuceně spouští úlohu na pozadí, ignoruje systémová omezení. V Xcode je k dispozici přepínač Simulate Background Fetch v nabídce Debug, který emuluje krátkou aktualizaci na pozadí. Pro analýzu výkonu se používá MetricKit — shromažďuje informace o frekvenci spouštění, době trvání a spotřebě energie každého úkolu. Tato data pomáhají optimalizovat frekvenci plánování a vybrat správný typ úkolu.
V praxi je BGTaskScheduler vhodný pro aktualizaci dat widgetů, synchronizaci iCloud, zpracování push oznámení s obsahem a indexování vyhledávání Spotlight. Není vhodný pro odesílání analýzy v reálném čase, chatovací aplikace nebo jakékoli úkoly vyžadující okamžité provedení.
Pro hloubkové studium BGTaskScheduler Apple doporučuje oficiální dokumentaci WWDC: relace „Advances in Background Tasks” (2020) pokrývá migraci ze zastaralých API a „Background Tasks in Practice” (2021) obsahuje skutečné případy použití. Užitečná je také sekce Energy Efficiency Guide, kde je popsáno, jak framework zapadá do celkové strategie úspory energie Apple. Příklady kódu jsou k dispozici v oficiálním repozitáři Apple Developer na GitHubu s kompletními projekty pro iOS a macOS.
Často kladené otázky
Background Fetch byl omezen na jeden úkol na pozadí na aplikaci a neměl mechanismus priorit. BGTaskScheduler podporuje více úkolů různých typů, poskytuje jednotné API a automatickou správu energie.
Apple nestanovuje výslovné omezení počtu registrovaných identifikátorů, ale v praxi se doporučuje používat ne více než 5–10 úkolů. Větší počet snižuje pravděpodobnost provedení každého konkrétního úkolu kvůli konkurenci o systémové zdroje.
Pro ladění použijte příkaz e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] v lldb. Vynuceně spouští úkol a obchází systémová omezení. K dispozici je také přepínač Xcode Simulate Background Fetch v nabídce Debug.
Ano, BGTaskScheduler může spustit proces, i když byla aplikace vynuceně ukončena uživatelem. Systém však může uplatnit dodatečná zpoždění a ne všechny typy úkolů zaručují spuštění v tomto scénáři.
Systém zavolá expirationHandler a pošle úkolu signál o nutnosti ukončení. Pokud aplikace tento signál ignoruje a pokračuje v práci, iOS vynuceně ukončí proces. Poté může systém snížit prioritu všech úloh na pozadí aplikace.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také