BGTaskScheduler: co to je, úlohy na pozadí iOS

Autor: IT Sectr Publikováno: 2026-03-27 Doba čtení: 8 min

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 framework iOS 13+ pro správu úloh na pozadí, který nahradil starý Background Fetch.
  • BGAppRefreshTask — krátká úloha na pozadí do 30 sekund pro aktualizaci obsahu.
  • BGProcessingTask — dlouhá úloha na pozadí do několika minut pro operace náročné na zdroje.
  • Registrace úkolů probíhá v Info.plist přes identifikátory a v kódu přes handleTasks.
  • Systém automaticky určuje optimální čas spuštění úkolů na základě chování uživatele.

Co je BGTaskScheduler?

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é.

Jak BGTaskScheduler funguje v iOS?

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.

Proces registrace úkolu

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.

swift
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)
}

Plánování provedení

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é.

swift
let request = BGAppRefreshTaskRequest(
    identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)

do {
    try BGTaskScheduler.shared.submit(request)
} catch {
    print("Chyba plánování: \(error)")
}

Typy úloh na pozadí BGTaskScheduler

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

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

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í.

ParametrBGAppRefreshTaskBGProcessingTask
Časový limit30 sekundněkolik minut
Frekvence spouštěnívysokánízká
Podmínkyjakékolinapájení + Wi-Fi
Vyžaduje napájenínedoporučeno
Příkladaktualizace kanáluzpracování videa

Registrace a plánování úkolů

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í.

Registrace v Info.plist

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.

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

Plánování a zrušení

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.

Sledování stavu úkolů

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.

swift
// 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ů")
}

Omezení a doporučení

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.

Kompatibilita s macOS a watchOS

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í.

Nástroje pro ladění a diagnostiku

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í.

Zdroje a dokumentace Apple

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

Čím se BGTaskScheduler liší od Background Fetch v iOS 12?

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.

Kolik úloh na pozadí lze zaregistrovat v BGTaskScheduler?

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.

Jak ladit provádění BGTaskScheduler na reálném zařízení?

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.

Může BGTaskScheduler provést úkol, pokud je aplikace ukončena?

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.

Co se stane, pokud se úkol nevejde do vyhrazeného času?

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í

  • BGTaskScheduler — je jednotný framework Apple pro správu všech úloh na pozadí v iOS 13+ a macOS Catalina+.
  • Dva typy úkolů — BGAppRefreshTask do 30 sekund a BGProcessingTask do několika minut — pokrývají různé scénáře práce na pozadí.
  • Registrace je povinná na dvou místech: Info.plist (identifikátory) a kód (registerHandler).
  • Plánování přes submitTaskRequest s earliestBeginDate — systém sám volí optimální okamžik spuštění.
  • ExpirationHandler je povinný pro zpracování vynuceného ukončení úkolu systémem.
  • Omezení zahrnují chybějící záruku provedení, kontrolu spotřeby energie a závislost na stavu zařízení.
  • Používejte BGTaskScheduler pro aktualizaci obsahu, synchronizaci a indexování, ale ne pro úkoly v reálném čase.

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í.

Prodiskutovat projekt

Přečtěte si také