Background Fetch — mechanismus iOS, který periodicky probouzí aplikaci na pozadí pro stahování čerstvého obsahu. Systém analyzuje chování uživatele a vybírá optimální okna pro aktualizaci. Podle údajů Apple, 2026 má aplikace 30 až 120 sekund na provedení operace, poté systém proces pozastaví nebo ukončí.
Hlavní body
Background Fetch — je iOS API, které umožňuje aplikaci periodicky přijímat čerstvá data na pozadí. Poprvé představen v iOS 7 spolu s mechanismem Background App Refresh. Hlavním cílem je, aby obsah byl aktuální v okamžiku, kdy uživatel otevře aplikaci, bez nutnosti čekat na načtení.
Push oznámení jsou iniciována serverem — ten posílá signál na zařízení a systém rozhodne, zda aplikaci probudit či nikoliv. Background Fetch je iniciován samotným iOS na základě vzorců používání zařízení. Push se hodí pro naléhavé zprávy, Fetch — pro plánovanou aktualizaci obsahu (novinky, feed sociální sítě).
Background Fetch — jeden z několika mechanismů provádění na pozadí v iOS. BGAppRefreshTask (iOS 13+) provádí stejný úkol, ale s flexibilnějším plánováním. Background Modes (audio, poloha) — pro nepřetržité operace. Silent Push — aktualizace iniciovaná serverem. Fetch zůstává relevantní pro projekty podporující iOS 12 a nižší.
iOS používá algoritmus strojového učení k určení optimálního času probuzení aplikace. Systém analyzuje, kdy uživatel obvykle otevírá aplikaci, jak dlouho ji používá a jak často se vrací. Na základě těchto dat iOS vypočítává okna pro Background Fetch.
Když se systém rozhodne probudit aplikaci, zavolá metodu application(_:performFetchWithCompletionHandler:) v AppDelegate. Aplikace by měla stáhnout minimální množství nových dat a zavolat completion handler s jedním ze tří statusů: .newData (data stažena), .noData (nejsou nová data) nebo .failed (chyba). Status ovlivňuje frekvenci budoucích probuzení.
Status .newData informuje systém, že aktualizace byla užitečná — iOS může zvýšit frekvenci probouzení. .noData říká, že data nejsou — frekvence zůstává stejná nebo klesá. .failed signalizuje problém — systém snižuje frekvenci, aby neplýtval baterií. Důraz by měl být na upřímném statusu, ne na vynuceném .newData.
| Status | Význam | Vliv |
|---|---|---|
| .newData | Data úspěšně stažena | Frekvence se může zvýšit |
| .noData | Kontrola neodhalila nová data | Frekvence zůstává stejná |
| .failed | Chyba sítě nebo serveru | Frekvence klesá |
Pro zapnutí Background Fetch je třeba provést dva kroky: aktivovat capability v Xcode a nastavit minimální interval v kódu. Capability se nachází v Target — Signing & Capabilities — Background Modes — zaškrtnout políčko Background Fetch. Bez tohoto kroku systém aplikaci neprobudí.
Metoda UIApplication.shared.setMinimumBackgroundFetchInterval nastavuje minimální čas v sekundách mezi voláními Fetch. Hodnota UIApplication.backgroundFetchIntervalMinimum (přibližně 15 minut) říká systému, aby probouzel aplikaci tak často, jak je energeticky efektivní. Nastavení intervalu v application(_:didFinishLaunchingWithOptions:) je standardní praxí.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Při zapnutí Background Fetch v Xcode automaticky aktualizuje Info.plist — přidá klíč UIBackgroundModes s hodnotou fetch. Toto je povinný krok: bez něj aplikace neobdrží volání performFetchWithCompletionHandler. Přítomnost lze zkontrolovat pomocí P list Source nebo Build Settings.
Podívejme se na plnou implementaci Background Fetch pro aplikaci novinek. Implementace zahrnuje stahování dat, ukládání do mezipaměti a volání completion handleru. Kód se spouští v AppDelegate — jediném místě, kde systém volá fetch.
func application(
_ application: UIApplication,
performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
let url = URL(string: "https://api.example.com/latest")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
handler(.failed)
return
}
do {
let articles = try JSONDecoder().decode([Article].self, from: data)
cacheArticles(articles)
handler(articles.isEmpty ? .noData : .newData)
} catch {
handler(.failed)
}
}.resume()
}
Po stažení dat pomocí Background Fetch je třeba je uložit do lokálního úložiště — CoreData, UserDefaults nebo File Manager. Při otevření aplikace by již měla být data k dispozici. Použijte CoreData s kontextem na pozadí pro bezpečný zápis ve vláknech. Po uložení aktualizujte UI v hlavním vlákně.
func cacheArticles(_ articles: [Article]) {
let container = NSPersistentContainer(name: "AppModel")
container.performBackgroundTask { context in
articles.forEach { article in
let entity = ArticleEntity(context: context)
entity.id = Int64(article.id)
entity.title = article.title
entity.body = article.body
}
try? context.save()
}
}
Pro testování použijte Simulator — vyberte Debug — Simulate Background Fetch v Xcode. Na fyzickém zařízení je třeba počkat, až se systém rozhodne provést fetch. Pro zrychlení lze nastavit minimální interval na 1 minutu, ale systém jej může stále ignorovat při nízkém stavu baterie.
Background Fetch má řadu omezení, která je důležité zvážit při návrhu architektury aplikace. Hlavní — systém zcela kontroluje frekvenci volání a vývojář ji nemůže zaručit. I s nastaveným minimálním intervalem může systém fetch nevolat celé hodiny.
Systém přiděluje aplikaci omezený čas na provedení úlohy — obvykle až 30 sekund. Pokud aplikace nevolá completion handler v tomto čase, systém násilně ukončí proces a snižuje frekvenci budoucích probuzení. Všechny síťové požadavky by měly být kompaktní — ne více než 1–2 na volání.
iOS bere v úvahu úroveň nabití baterie při plánování Background Fetch. Při úrovni pod 20 % frekvence probouzení klesá. Při zapnutém Low Power Mode může systém zcela vypnout aktualizace na pozadí pro věechny aplikace. Uživatel také může vypnout Background App Refresh pro konkrétní aplikaci v nastavení.
URLSession spuštěná z Background Fetch funguje ve standardním režimu — bez podpory relací na pozadí. Pro velké stahování použijte URLSession s background configuration. Systém bude ve stahování pokračovat i po dokončení fetch, ale prùběh nebude sledován až do příštího probuzení.
Počínaje iOS 13 Apple doporučuje BGTaskScheduler jako náhradu za Background Fetch. BGTaskScheduler poskytuje flexibilnější plánování, dva typy úloh (refresh a processing) a registraci úloh s identifikátory. Migrace zahrnuje několik kroků a je doporučena pro věechny nové projekty.
První krok — určit identifikátory úloh v Info.plist pomocí klíče BGTaskSchedulerPermittedIdentifiers. Druhý — zaregistrovat úlohy v AppDelegate pomocí BGTaskScheduler.shared.register. Třetí — nahradit volání performFetchWithCompletionHandler handlerem předaným do register. Čtvrtý — zavolat submit pro naplánování úlohy.
// Dříve (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Po migraci (BGTaskScheduler)
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
let request = BGAppRefreshTaskRequest(
identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
BGTaskScheduler poskytuje více kontroly: BGProcessingTask pro dlouhodobé operace (až 10 minut), podmínky provádění pomocí requiresNetworkConnectivity a requiresExternalPower, expiration handler pro hladké ukončení. Systém také analyzuje používání aplikace, ale vývojář může stanovit přesnější požadavky.
Pokud aplikace podporuje iOS 12 a nižší, Background Fetch zůstává jedinou možností pro periodickou aktualizaci. BGTaskScheduler je dostupný až od iOS 13+. V tomto případě použijte obálku: kontrolujte dostupnost BGTaskScheduler pomocí if #available(iOS 13, *) a volejte příslušné API.
Často kladené otázky
Přesná frekvence není zdokumentována a závisí na chování uživatele. Systém analyzuje, jak často uživatel otevírá aplikaci, a přizpùsobuje frekvenci. V prùměru při aktivním používání mùže být fetch volán 1–3krát za hodinu. Při řídkém používání — 1–2krát denně.
Zkontrolujte tři podmínky: Background Fetch capability je zapnuta v Xcode, je nastaven minimumBackgroundFetchInterval a uživatel nevypnul Background App Refresh pro aplikaci v nastavení. Takež zkontrolujte, zda zařízení není v Low Power Mode a úroveň baterie je nad 20 %.
Background Fetch — staré API (iOS 7), BGAppRefreshTask — nové API (iOS 13+). BGAppRefreshTask poskytuje více kontroly: expiration handler, možnost přeplánování a kontroly stavu. Background Fetch je jednodušší na implementaci, ale méně flexibilní. Apple doporučuje používat BGAppRefreshTask pro nové projekty.
Nedoporučuje se. Background Fetch je časově omezen (až 30 sekund). Pro velké stahování použijte URLSession s background configuration — systém bude ve stahování pokračovat i po dokončení fetch. Alternativa — BGProcessingTask (iOS 13+), kde je k dispozici až 10 minut a podmínky nabíjení.
Ano, každé probuzení spotřebovává energii na zapnutí procesoru, inicializaci síťového zásobníku a stažení dat. iOS optimalizuje frekvenci, aby minimalizoval dopad. Při správné implementaci — stažení pouze nových dat, rychlé volání completion handleru — je dopad na baterii minimální.
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é