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 — 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 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 | Účel | API |
|---|---|---|
| Attributes | Statická data celé Activity | let name: String, let icon: String |
| ContentState | Dynamický stav, měnící se při aktualizaci | var progress: Double, var status: Status |
| Activity | Objekt pro vyžádání a správu Activity | Activity.request(attributes:content:) |
| PushToken | Token pro serverové push aktualizace | activity.pushToken publisher |
| ActivityUI | SwiftUI View pro Lock Screen a Dynamic Island | LockScreenView, 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.
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í 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.
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.
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.
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.
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.
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
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.
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.
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í.
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.
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í
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é