Background Fetch: co to je, princip fungování a konfigurace aktualizací

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

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 — iOS API pro periodickou aktualizaci obsahu na pozadí.
  • Systém řídí frekvenci probouzení na základě analýzy chování uživatele.
  • Minimální interval se nastavuje přes UIApplication.minimumBackgroundFetchInterval.
  • Zastarávání — od iOS 13+ je mechanismus považován za legacy, doporučuje se BGTaskScheduler.
  • Doba provádění — až 30 sekund, poté systém úlohu násilně ukončí.

Co je Background Fetch v iOS?

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

Rozdíl od Push oznámení

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ě).

Místo v ekosystému úloh na pozadí

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

  • Background Fetch — periodické, iniciováno systémem, iOS 7+.
  • BGAppRefreshTask — periodické, iniciováno systémem, iOS 13+.
  • BGProcessingTask — dlouhodobé úlohy, iOS 13+.
  • Silent Push — iniciováno serverem, iOS 7+.

Jak funguje Background Fetch: architektura a životní cyklus

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.

Proces provádění úlohy

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

Vliv completion handleru na frekvenci volání

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.

StatusVýznamVliv
.newDataData úspěšně staženaFrekvence se může zvýšit
.noDataKontrola neodhalila nová dataFrekvence zůstává stejná
.failedChyba sítě nebo serveruFrekvence klesá

Nastavení Background Fetch v projektu Xcode

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

Nastavení minimálního intervalu

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

swift
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(
        UIApplication.backgroundFetchIntervalMinimum
    )
    return true
}

Info.plist a capability

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.

Příklady kódu Background Fetch ve Swift

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.

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

Ukládání stažených dat do mezipaměti

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

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

Testování Background Fetch

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.

Omezení a úskalí

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.

Omezení doby provádění

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

Závislost na baterii

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

Síťová omezení

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

Migrace z Background Fetch na BGTaskScheduler

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.

Kroková migrace

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.

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

Výhody BGTaskScheduler

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.

Kdy ponechat Background Fetch

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

Jak často iOS volá Background Fetch?

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

Proč není mùj Background Fetch volán?

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

Jaký je rozdíl mezi Background Fetch a BGAppRefreshTask?

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.

Lze stahovat velké soubory pomocí Background Fetch?

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

Spotřebovává Background Fetch baterii?

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í

  • Background Fetch — iOS API pro periodické stahování dat na pozadí, dostupný od iOS 7 a doporučený k nahrazení BGTaskScheduler.
  • Systém řídí frekvenci volání analýzou chování uživatele — vývojář nemùže zaručit čas probuzení.
  • Tři statusy completion handleru — .newData, .noData, .failed — ovlivňují frekvenci budoucích probuzení aplikace.
  • Omezení 30 sekund — neprovádějte dlouhé operace nebo více po sobě jdoucích síťových požadavků.
  • Capability je povinná — Background Fetch v Xcode + nastavení minimumBackgroundFetchInterval v kódu.
  • BGTaskScheduler — moderní náhrada od iOS 13+, poskytující více kontroly a dva typy úloh.
  • Pro projekty podporující iOS 12 a nižší použijte Background Fetch s kontrolou dostupnosti BGTaskScheduler pomocí if #available.

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é