Live Activity — egy dinamikus widget az iPhone zárolási képernyőjén és a Dynamic Islandben, amely valós időben jelenít meg információkat: szállítási állapot, sporteredmények, időzítők és zenelejátszás. Az ActivityKit (Swift, iOS 16.1+) segítségével valósul meg a WidgetKitkel együtt. A Live Activity helyben vagy push értesítéseken keresztül frissül, több állapotot támogat, és a rendszer befejezi az esemény befejezése után. Bővebben a ActivityKit Documentation oldalon.
Főbb pontok
Live Activity — a WidgetKit kiterjesztése, amely dinamikus tartalmat jelenít meg az iPhone zárolási képernyőjén és a Dynamic Islandben. Ellentétben a statikus widgettel, amely a rendszer időzítője szerint frissül, a Live Activity-t egy alkalmazás indítja el, és korlátozott ideig él — akár 8 óráig aktív Activity esetén, és akár 4 óráig a befejezés után. A felhasználó a készülék feloldása nélkül látja az aktuális adatokat: szállítási rendelés állapota, távolság a célig taxiban, meccseredmény vagy edzés előrehaladása.
ActivityKit — keretrendszer a Live Activities kezeléséhez, bevezetve iOS 16.1-ben. API-t biztosít az Activity kéréséhez, frissítéséhez és befejezéséhez. Az Activity egy objektum tartalommal és állapottal. A tartalom (ActivityContent) a statikus adatokat határozza meg, az állapot (ActivityState) pedig a dinamikus, időben változó adatokat. A rendszer maga dönti el, mikor renderelje az új állapotot — ez kíméli az akkumulátort és garantálja az animációk simaságát.
Minden Live Activity egyedileg azonosítható ActivityID-vel, és egyetlen folyamathoz — az azt létrehozó alkalmazáshoz — van kötve. A rendszer befejezheti az Activity-t memória hiánya vagy alacsony akkumulátorszint esetén. A fejlesztő értesítést kap a kényszerített befejezésről az ActivityKit delegátuson keresztül, és elmentheti az utolsó állapotot a helyreállításhoz.
A Live Activity architektúrája két keretrendszerre épül: a WidgetKit felel a SwiftUI nézetek rendereléséért, az ActivityKit pedig az Activity életciklusáért. A fejlesztő létrehoz egy WidgetBundle-t LiveActivityConfiguration támogatással. Minden konfiguráció meghatározza az adattípust (Attributes és State) és a SwiftUI View-t, amelyet a rendszer a Lock Screen-en és a Dynamic Islandben renderel. Az adatok ActivityAttributes-en keresztül kerülnek átadásra — egy struct let mezőkkel a tartalomhoz és var mezőkkel az állapothoz.
| Komponens | Rendeltetés | API |
|---|---|---|
| Attributes | A teljes Activity statikus adatai | let name: String, let icon: String |
| ContentState | Dinamikus állapot, frissítéskor változik | var progress: Double, var status: Status |
| Activity | Az Activity kérésének és kezelésének objektuma | Activity.request(attributes:content:) |
| PushToken | Token szerver oldali push frissítésekhez | activity.pushToken publisher |
| ActivityUI | SwiftUI View Lock Screen-hez és Dynamic Islandhez | LockScreenView, ExpandedView, CompactView |
Az Activity életciklusa három fázisból áll: aktív (a rendszer megjeleníti és frissíti), végleges (a tevékenység befejeződött, de az UI még 4 óráig látható), törölt (a rendszer eltávolítja az UI-t). Az alkalmazás bármikor befejezheti az Activity-t. A rendszer is kényszerítve befejezheti az Activity-t — például a készülék újraindításakor vagy a 8 órás korlát lejártakor.
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle regisztrálja a Live Activity-t a @main makrón keresztül: a widget visszaadja a konfigurációk listáját, beleértve a LiveActivityConfiguration-t. E konfiguráció alapján a rendszer tudja, milyen adattípusokra számítson, és hogyan renderelje az UI-t különböző állapotokban — kompakt, minimális és kibővített a Dynamic Island számára.
Activity létrehozása az ActivityKit felé történő kéréssel kezdődik. Az alkalmazás meghívja az Activity.request(attributes:content:pushType:) függvényt a kezdeti adatokkal. A rendszer ellenőrzi, hogy a Dynamic Island elérhető-e a készüléken, és visszaad egy Activity objektumot. A kérés meghiúsulhat, ha túllépték az aktív Activity-k számának korlátját — általában nem több mint 5 egyidejűleg. Sikeres kérés után a rendszer megjeleníti a widgetet a Lock Screen-en és, ha lehetséges, a Dynamic Islandben.
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 Live Activity-hez a WidgetKit LockScreenView, ExpandedView és CompactView struktúráit használja. A View kontextust kap (ActivityViewContext) az aktuális attribútumokkal és állapottal. A View frissítése automatikusan megtörténik, amikor új állapot érkezik a rendszertől. A Live Activity csak korlátozott SwiftUI komponenskészletet támogat — Text, Image, HStack, VStack és néhány módosítót.
Minden Live Activity View-nak könnyűnek és gyorsnak kell lennie — a rendszer megtagadja a nehéz nézetek renderelését. A renderelési idő korlátja — 30 ms képkockánként. Az animációk az állapotok közötti rendszerátmenetekre korlátozódnak — egyéni animációk nem érhetők el a Live Activity-ben. A renderelés a WidgetKit folyamatának hátterében történik a Lock Screen válaszkészségének prioritásával.
Helyi frissítés — az alkalmazás frissíti az Activity állapotát az activity.update(using:) hívással. A metódus új ContentState-t és opcionális AlertConfiguration-t fogad a frissítéskor megjelenő értesítéshez. A helyi frissítések gyorsak — a rendszer a következő renderelési ciklusban újrarajzolja a View-t, általában 1–2 másodpercen belül. Gyakori frissítésekhez (időzítő, stopper) használja a helyi módot — ez megbízhatóbb és gyorsabb, mint a 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 frissítések — a szerver ActivityKit push értesítést küld az új állapottal JSON formátumban. Ehhez az alkalmazás lekéri a pushToken-t az activity.pushToken publisher-ből, és továbbítja a szervernek. A szerver POST kérést küld az APNs-nek az új ContentState-t tartalmazó payload-dal. A rendszer fogadja a push-t, dekódolja az állapotot, és frissíti a Live Activity-t az alkalmazás részvétele nélkül — ez lehetővé teszi az Activity frissítését még akkor is, ha az alkalmazás be van zárva.
A push frissítések gazdaságosabbak a helyinél ritka frissítések esetén (szállítási állapot 5–10 percenként) — az alkalmazásnak nem kell hálózati kapcsolatot fenntartania. Gyakori, 1–2 másodpercenkénti frissítésekhez használja a helyi módszert. A szerver payload csak a ContentState változó mezőit tartalmazza — az Attributes statikus adatai csak az Activity létrehozásakor kerülnek elküldésre.
Dynamic Island — egy hardver-szoftver terület az iPhone 14 Pro, 15 Pro és újabb készülékeken, amely alkalmazkodik a Live Activity tartalmához. A rendszer automatikusan három módban jeleníti meg az Activity-t: kompakt (ikon + rövid szöveg a kivágástól balra), minimális (csak ikon) és kibővített (300pt téglalap információkkal). A fejlesztő nem közvetlenül kezeli ezeket a módokat — a rendszer választja ki a módot prioritás és rendelkezésre álló hely alapján.
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)
}
}
}
}
A Dynamic Island támogatja az interaktivitást — a felhasználó megérinti a területet, és belép az alkalmazásba, vagy megnyitja a kibővített nézetet. A kompakt mód megérintése átvált kibővített módba, a balra húzás pedig minimális módba rejti az Activity-t. A kibővített mód gombjait (pause/cancel) a SwiftUI Link segítségével kezeljük — a rendszer elindítja az alkalmazást egy deep link URL-lel, a feldolgozás az UIApplicationDelegate-ben történik.
A Dynamic Island korlátai: a kibővített mód szélessége — legfeljebb 300pt, a kompakt szöveg — legfeljebb 30 karakter. A színek és betűtípusok megfelelnek a rendszertémának — a testreszabás korlátozott. A módok közötti átmeneti animációk rendszerszintűek és nem konfigurálhatók. Ha több alkalmazásnak van aktív Activity-je, a Dynamic Island ezeket prioritással jeleníti meg az indítási idő és a tartalom típusa alapján.
Gyakran ismételt kérdések
A szokásos WidgetKit widget statikus információkat jelenít meg, és a rendszer időzítője szerint frissül minimum 15–30 perces intervallumban. A Live Activity dinamikus adatokat mutat valós időben a zárolási képernyőn és a Dynamic Islandben. A Live Activity-t az alkalmazás indítja el, akár 8 óráig él, és a rendszer befejezi az esemény befejezése után, ellentétben a widgettel, amely állandóan létezik.
A Live Activity két frissítési módot támogat: helyi — az alkalmazás az ActivityKit API-n keresztül bármikor frissíti az állapotot, és push — a szerver ActivityKit push értesítést küld, amelyet a rendszer a widget új állapotává alakít. Alacsony akkumulátorszint esetén a rendszer lefagyaszthatja a Live Activity-t a töltő csatlakoztatásáig.
A Live Activities iOS 16.1 és újabb rendszerű iPhone készülékeken érhetők el. iPhone 14 Pro és újabb készülékeken a Live Activity a Dynamic Islandben is megjelenik. iPaden a Live Activity csak a zárolási képernyőn támogatott — Dynamic Island iPaden nem létezik. Az Apple Watch nem támogatja közvetlenül a Live Activities-t, de megjelenítheti a befejezésről szóló értesítéseket.
A rendszer korlátozza az aktív Live Activities számát — általában legfeljebb 5 egyszerre az összes alkalmazás számára. A korlát túllépésére tett kísérletnél az ActivityKit hibát ad vissza. Minden Live Activity több állapottal rendelkezhet — például várakozás, úton, kézbesítve egy ételrendeléshez. A befejezés után az Activity további 4 óráig marad az UI-ban.
Igen, az alkalmazásnak engedélyt kell kérnie az értesítések küldéséhez — a Live Activity a rendszer értesítési csatornáját használja. A felhasználó kikapcsolhatja a Live Activity-t egy adott alkalmazáshoz a beállításokban. Az első indításkor az ActivityKit egy párbeszédablakot jelenít meg az engedély kérésével. Engedély nélkül az Activity kérés hibával meghiúsul.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is