Live Activity — co to je, widgety na zamykací obrazovce

Autor: IT Sectr Publikováno: 2026-02-15 Doba čtení: 9 min

Live Activity — dynamický widget na zamykací obrazovce iPhone a v Dynamic Island, zobrazující informace v reálném čase: stav doručení, sportovní skóre, časovače a přehrávání hudby. Implementuje se přes ActivityKit (Swift, iOS 16.1+) společně s WidgetKit. Live Activity se aktualizuje lokálně nebo pomocí push notifikací, podporuje několik stavů a systém jej ukončí po skončení události. Více na ActivityKit Documentation.

Hlavní body

  • Live Activity — widget v reálném čase na Lock Screen a Dynamic Island
  • ActivityKit — framework pro spouštění a správu Live Activities v iOS 16.1+
  • Push aktualizace — server odesílá nový stav přes ActivityKit push notifikace
  • Stavy — každá Activity podporuje aktivní a dokončený stav s různým UI
  • Dynamic Island — kompaktní zobrazení Live Activity na iPhone 14 Pro a novějších

Co je Live Activity — widget na Lock Screen?

Live Activity — rozšíření WidgetKit, které zobrazuje dynamický obsah na zamykací obrazovce iPhone a v Dynamic Island. Na rozdíl od statického widgetu, který se aktualizuje podle systémového časovače, Live Activity spouští aplikace a žije po omezenou dobu — až 8 hodin pro aktivní Activity a až 4 hodiny po dokončení. Uživatel vidí aktuální data bez odemknutí zařízení: stav objednávky doručení, vzdálenost k cíli v taxíku, výsledek zápasu nebo průběh tréninku.

ActivityKit — framework pro práci s Live Activities, představený v iOS 16.1. Poskytuje API pro vyžádání, aktualizaci a ukončení Activity. Activity je objekt s obsahem a stavem. Obsah (ActivityContent) definuje statická data, stav (ActivityState) — dynamická data měnící se v čase. Systém sám rozhoduje, kdy vykreslit nový stav — šetří to baterii a zaručuje plynulost animací.

Každá Live Activity je jednoznačně identifikována ActivityID a vázána na jeden proces — aplikaci, která ji vytvořila. Systém může ukončit Activity při nedostatku paměti nebo nízké baterii. Vývojář obdrží oznámení o vynuceném ukončení prostřednictvím delegáta ActivityKit a může uložit poslední stav pro obnovení.

Architektura ActivityKit a WidgetKit

Architektura Live Activity je postavena na dvou frameworkách: WidgetKit je zodpovědný za vykreslování SwiftUI pohledů, ActivityKit — za životní cyklus Activity. Vývojář vytvoří WidgetBundle s podporou LiveActivityConfiguration. Každá konfigurace definuje typ dat (Attributes a State) a SwiftUI View, který systém vykresluje na Lock Screen a Dynamic Island. Data jsou přenášena přes ActivityAttributes — struct s let poli pro obsah a var poli pro stav.

KomponentaÚčelAPI
AttributesStatická data celé Activitylet name: String, let icon: String
ContentStateDynamický stav, měnící se při aktualizacivar progress: Double, var status: Status
ActivityObjekt pro vyžádání a správu ActivityActivity.request(attributes:content:)
PushTokenToken pro serverové push aktualizaceactivity.pushToken publisher
ActivityUISwiftUI View pro Lock Screen a Dynamic IslandLockScreenView, ExpandedView, CompactView

Životní cyklus Activity zahrnuje tři fáze: aktivní (systém zobrazuje a aktualizuje), finální (aktivita dokončena, ale UI je stále viditelné 4 hodiny), odstraněná (systém odstraní UI). Aplikace může ukončit Activity kdykoli. Systém také ukončuje Activity vynuceně — například při restartu zařízení nebo vypršení 8hodinového limitu.

swift
import ActivityKit

struct DeliveryAttributes: ActivityAttributes {
    public struct ContentState: Codable & Hashable {
        var status: DeliveryStatus
        var estimatedMinutes: Int
    }
    var orderNumber: String
    var restaurantName: String
}

WidgetBundle registruje Live Activity pomocí makra @main: widget vrací seznam konfigurací včetně LiveActivityConfiguration. Na základě této konfigurace systém ví, jaké typy dat očekávat a jak vykreslit UI v různých stavech — kompaktním, minimálním a rozšířeném pro Dynamic Island.

Vytvoření Live Activity s WidgetKit a SwiftUI

Vytvoření Activity začíná požadavkem na ActivityKit. Aplikace zavolá Activity.request(attributes:content:pushType:) s počátečními daty. Systém zkontroluje, zda je Dynamic Island na zařízení k dispozici, a vrátí objekt Activity. Požadavek může selhat, pokud je překročen limit aktivních Activity — obvykle ne více než 5 současně. Po úspěšném požadavku systém zobrazí widget na Lock Screen a, pokud je to možné, v Dynamic Island.

swift
let attributes = DeliveryAttributes(
    orderNumber: "A-1234",
    restaurantName: "Pizza House"
)

let initialState = DeliveryAttributes.ContentState(
    status: DeliveryStatus.preparing,
    estimatedMinutes: 30
)

do {
    let activity = try await Activity<DeliveryAttributes>.request(
        attributes: attributes,
        content: ActivityContent(state: initialState, staleDate: nil),
        pushType: .token
    )
    print("Activity started: \(activity.id)")
} catch {
    print("Failed: \(error)")
}

SwiftUI View pro Live Activity používá struktury LockScreenView, ExpandedView a CompactView z WidgetKit. View obdrží kontext (ActivityViewContext) s aktuálními atributy a stavem. Aktualizace View probíhá automaticky při přijetí nového stavu od systému. Live Activity podporuje pouze omezenou sadu SwiftUI komponent — Text, Image, HStack, VStack a několik modifikátorů.

Každý Live Activity View musí být lehký a rychlý — systém odmítá vykreslovat těžké pohledy. Časový limit vykreslování — 30 ms na snímek. Animace jsou omezeny na systémové přechody mezi stavy — vlastní animace v Live Activity nejsou k dispozici. Vykreslování probíhá na pozadí procesu WidgetKit s prioritou odezvy Lock Screen.

Aktualizace Live Activity lokálně a přes push

Lokální aktualizace — aplikace aktualizuje stav Activity voláním activity.update(using:). Metoda přijímá nový ContentState a volitelný AlertConfiguration pro zobrazení oznámení při aktualizaci. Lokální aktualizace jsou rychlé — systém překreslí View v následujícím cyklu vykreslování, obvykle do 1–2 sekund. Pro časté aktualizace (časovač, stopky) používejte lokální režim — je spolehlivější a rychlejší než push.

swift
let updatedState = DeliveryAttributes.ContentState(
    status: DeliveryStatus.outForDelivery,
    estimatedMinutes: 10
)

await activity.update(
    ActivityContent<DeliveryAttributes.ContentState>(
        state: updatedState,
        staleDate: Date().addingTimeInterval(60)
    ),
    alertConfiguration: AlertConfiguration(
        title: "Order out for delivery",
        body: "Arriving in 10 min"
    )
)

Push aktualizace — server odesílá ActivityKit push notifikaci s novým stavem ve formátu JSON. K tomu aplikace získá pushToken z activity.pushToken publisher a předá jej serveru. Server odešle POST požadavek na APNs s payloadem obsahujícím nový ContentState. Systém přijme push, dekóduje stav a aktualizuje Live Activity bez účasti aplikace — to umožňuje aktualizovat Activity i když je aplikace zavřená.

Push aktualizace jsou úspornější než lokální pro řídké aktualizace (stav doručení každých 5–10 minut) — aplikace nemusí udržovat síťové připojení. Pro časté aktualizace každých 1–2 sekund používejte lokální metodu. Serverový payload obsahuje pouze proměnná pole ContentState — statická data Attributes se odesílají pouze při vytvoření Activity.

Zobrazení Live Activity v Dynamic Island

Dynamic Island — hardwarově-softwarová oblast na iPhone 14 Pro, 15 Pro a novějších, která se přizpůsobuje obsahu Live Activity. Systém automaticky zobrazuje Activity ve třech režimech: kompaktní (ikona + krátký text vlevo od výřezu), minimální (pouze ikona) a rozšířený (obdélník 300pt s informacemi). Vývojář tyto režimy přímo neřídí — systém vybírá režim na základě priority a dostupného místa.

swift
struct DeliveryLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DeliveryAttributes.self) { context in
            LockScreenView(context: context)
        } dynamicIsland: { context in
            DynamicIsland {
                DynamicIslandExpandedContent {
                    ExpandedView(context: context)
                }
            } compactLeading: {
                CompactLeadingView(context: context)
            } compactTrailing: {
                CompactTrailingView(context: context)
            } minimal: {
                MinimalView(context: context)
            }
        }
    }
}

Dynamic Island podporuje interaktivitu — uživatel se dotkne oblasti a vstoupí do aplikace nebo otevře rozšířený pohled. Klepnutí na kompaktní režim přepne do rozšířeného režimu, přejetí doleva skryje Activity do minimálního režimu. Tlačítka v rozšířeném režimu (pause/cancel) jsou zpracovávána přes Link ze SwiftUI — systém spustí aplikaci s deep link URL, zpracování probíhá v UIApplicationDelegate.

Omezení Dynamic Island: šířka rozšířeného režimu — až 300pt, kompaktní text — až 30 znaků. Barvy a písma odpovídají systémovému motivu — přizpůsobení je omezené. Animace přechodů mezi režimy jsou systémové a nelze je konfigurovat. Pokud má více aplikací aktivní Activity, Dynamic Island je zobrazuje s prioritou podle času spuštění a typu obsahu.

Často kladené otázky

Čím se Live Activity liší od běžného widgetu?

Běžný WidgetKit widget zobrazuje statické informace a aktualizuje se podle systémového časovače s minimálním intervalem 15–30 minut. Live Activity ukazuje dynamická data v reálném čase na zamykací obrazovce a v Dynamic Island. Live Activity spouští aplikace, žije až 8 hodin a systém ji ukončí po skončení události, na rozdíl od widgetu, který existuje trvale.

Jak často se Live Activity aktualizuje?

Live Activity podporuje dva režimy aktualizace: lokální — aplikace aktualizuje stav přes API ActivityKit kdykoli, a push — server odešle ActivityKit push notifikaci, kterou systém převede na nový stav widgetu. Při nízké baterii může systém Live Activity zmrazit do připojení nabíječky.

Na jakých zařízeních Live Activities fungují?

Live Activities jsou dostupné na iPhone s iOS 16.1 a novějším. Na iPhone 14 Pro a novějších se Live Activity zobrazuje také v Dynamic Island. Na iPadu je Live Activity podporováno pouze na zamykací obrazovce — Dynamic Island na iPadu neexistuje. Apple Watch nepodporují Live Activities přímo, ale mohou zobrazovat oznámení o dokončení.

Kolik Live Activities může běžet současně?

Systém omezuje počet aktivních Live Activities — obvykle ne více než 5 současně pro všechny aplikace. Při pokusu o překročení limitu ActivityKit vrátí chybu. Každá Live Activity může mít několik stavů — například čekání, na cestě, doručeno pro objednávku jídla. Po dokončení zůstává Activity v UI další 4 hodiny.

Je potřeba povolení uživatele pro Live Activity?

Ano, aplikace musí požádat o povolení k odesílání notifikací — Live Activity používá systémový kanál notifikací. Uživatel může vypnout Live Activity pro konkrétní aplikaci v nastavení. Při prvním spuštění ActivityKit zobrazí dialog s žádostí o povolení. Bez povolení požadavek Activity selže s chybou.

Shrnutí

  • Live Activity — dynamický widget na Lock Screen a Dynamic Island s aktualizací v reálném čase
  • ActivityKit — framework iOS 16.1+ pro správu životního cyklu Live Activities
  • Attributes and State — statická data a dynamický stav Activity předávané SwiftUI View
  • Push aktualizace — server odesílá nový stav přes APNs bez účasti aplikace
  • Dynamic Island — tři režimy zobrazení: kompaktní, minimální a rozšířený obdélník
  • Limity — až 5 aktivních Activity, až 8 hodin života, až 4 hodiny po dokončení
  • AlertConfiguration — volitelné oznámení při aktualizaci stavu Activity

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é