Live Activity ist ein dynamisches Widget auf dem iPhone-Sperrbildschirm und in Dynamic Island, das Echtzeitinformationen anzeigt: Lieferstatus, Sportergebnisse, Timer und Musikwiedergabe. Es wird über ActivityKit (Swift, iOS 16.1+) zusammen mit WidgetKit implementiert. Live Activity wird lokal oder über Push-Benachrichtigungen aktualisiert, unterstützt mehrere Zustände und wird vom System nach Ende des Ereignisses beendet. Weitere Informationen unter ActivityKit Documentation.
Wichtige Punkte
Live Activity ist eine Erweiterung von WidgetKit, die dynamische Inhalte auf dem iPhone-Sperrbildschirm und in Dynamic Island anzeigt. Im Gegensatz zu einem statischen Widget, das über einen System-Timer aktualisiert wird, wird Live Activity von der App gestartet und lebt für eine begrenzte Zeit — bis zu 8 Stunden für eine aktive Activity und bis zu 4 Stunden nach Abschluss. Der Benutzer sieht aktuelle Daten, ohne das Gerät zu entsperren: Lieferstatus, Entfernung zum Ziel im Taxi, Sportergebnisse oder Trainingsfortschritt.
ActivityKit ist ein Framework für die Arbeit mit Live Activities, das in iOS 16.1 eingeführt wurde. Es bietet eine API zum Anfordern, Aktualisieren und Beenden von Activities. Eine Activity ist ein Objekt mit Inhalt und Zustand. Der Inhalt (ActivityContent) definiert statische Daten, während der Zustand (ActivityState) dynamische Daten definiert, die sich im Laufe der Zeit ändern. Das System entscheidet selbst, wann ein neuer Zustand gerendert wird — das spart Batterie und gewährleistet flüssige Animationen.
Jede Live Activity wird eindeutig durch eine ActivityID identifiziert und an einen Prozess gebunden — die App, die sie erstellt hat. Das System kann die Activity bei niedrigem Arbeitsspeicher oder niedrigem Akkustand beenden. Der Entwickler erhält eine Benachrichtigung über die erzwungene Beendigung über den ActivityKit-Delegaten und kann den letzten Zustand für die Wiederherstellung speichern.
Die Live Activity-Architektur basiert auf zwei Frameworks: WidgetKit ist für das Rendern von SwiftUI-Ansichten zuständig, ActivityKit für den Activity-Lebenszyklus. Der Entwickler erstellt ein WidgetBundle mit Unterstützung für LiveActivityConfiguration. Jede Konfiguration definiert den Datentyp (Attributes und State) und eine SwiftUI-Ansicht, die das System auf dem Sperrbildschirm und Dynamic Island rendert. Daten werden über ActivityAttributes übergeben — eine Struktur mit let-Feldern für Inhalt und var-Feldern für den Zustand.
| Komponente | Zweck | API |
|---|---|---|
| Attributes | Statische Daten der gesamten Activity | let name: String, let icon: String |
| ContentState | Dynamischer Zustand, bei Aktualisierung änderbar | var progress: Double, var status: Status |
| Activity | Objekt zum Anfordern und Verwalten der Activity | Activity.request(attributes:content:) |
| PushToken | Token für Server-Push-Updates | activity.pushToken publisher |
| ActivityUI | SwiftUI-Ansicht für Sperrbildschirm und Dynamic Island | LockScreenView, ExpandedView, CompactView |
Activity-Lebenszyklus umfasst drei Phasen: aktiv (System zeigt an und aktualisiert), final (Activity beendet, aber UI noch 4 Stunden sichtbar), entfernt (System entfernt UI). Die App kann die Activity jederzeit beenden. Das System beendet Activities auch zwangsweise — zum Beispiel beim Neustart des Geräts oder Ablauf der 8-Stunden-Grenze.
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle registriert Live Activity über das @main-Makro: das Widget gibt eine Liste von Konfigurationen einschließlich LiveActivityConfiguration zurück. Basierend auf dieser Konfiguration weiß das System, welche Datentypen zu erwarten sind und wie die UI in verschiedenen Zuständen zu rendern ist — kompakt, minimal und erweitert für Dynamic Island.
Eine Activity erstellen beginnt mit einer Anfrage an ActivityKit. Die App ruft Activity.request(attributes:content:pushType:) mit Anfangsdaten auf. Das System prüft, ob Dynamic Island auf dem Gerät verfügbar ist, und gibt ein Activity-Objekt zurück. Die Anfrage kann fehlschlagen, wenn das Limit aktiver Activities überschritten wird — in der Regel nicht mehr als 5 gleichzeitig. Nach einer erfolgreichen Anfrage zeigt das System das Widget auf dem Sperrbildschirm und, falls verfügbar, in Dynamic Island an.
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)")
}
Die SwiftUI-Ansicht für Live Activity verwendet die Strukturen LockScreenView, ExpandedView und CompactView aus WidgetKit. Die Ansicht empfängt den Kontext (ActivityViewContext) mit aktuellen Attributen und Zustand. Die Aktualisierung der Ansicht erfolgt automatisch, wenn ein neuer Zustand vom System eintrifft. Live Activity unterstützt nur eine begrenzte Anzahl von SwiftUI-Komponenten — Text, Image, HStack, VStack und einige Modifikatoren.
Jede Live Activity-Ansicht muss leicht und schnell sein — das System weigert sich, schwere Ansichten zu rendern. Die Rendering-Zeitgrenze beträgt 30 ms pro Frame. Animationen sind auf Systemübergänge zwischen Zuständen beschränkt — benutzerdefinierte Animationen sind in Live Activity nicht verfügbar. Das Rendern erfolgt in einem Hintergrundprozess von WidgetKit mit Priorität für die Sperrbildschirm-Reaktionsfähigkeit.
Lokales Update — die App aktualisiert den Activity-Zustand durch Aufruf von activity.update(using:). Die Methode akzeptiert einen neuen ContentState und eine optionale AlertConfiguration zum Anzeigen einer Benachrichtigung bei der Aktualisierung. Lokale Updates sind schnell — das System zeichnet die Ansicht im nächsten Renderzyklus neu, normalerweise innerhalb von 1–2 Sekunden. Für häufige Updates (Timer, Stoppuhr) verwenden Sie den lokalen Modus — er ist zuverlässiger und schneller als 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-Updates — der Server sendet eine ActivityKit-Push-Benachrichtigung mit dem neuen Zustand im JSON-Format. Dazu empfängt die App einen pushToken vom activity.pushToken-Publisher und übergibt ihn an den Server. Der Server sendet eine POST-Anfrage an APNs mit einem Payload, der den neuen ContentState enthält. Das System empfängt den Push, dekodiert den Zustand und aktualisiert die Live Activity ohne Beteiligung der App — dies ermöglicht die Aktualisierung der Activity, auch wenn die App geschlossen ist.
Push-Updates sind für seltene Updates (Lieferstatus alle 5–10 Minuten) effizienter als lokale — die App muss keine Netzwerkverbindung aufrechterhalten. Für häufige Updates alle 1–2 Sekunden verwenden Sie die lokale Methode. Der Server-Payload enthält nur die änderbaren Felder des ContentState — statische Attributes-Daten werden nur beim Erstellen der Activity gesendet.
Dynamic Island ist ein Hardware-Software-Bereich auf iPhone 14 Pro, 15 Pro und neuer, der sich an den Inhalt der Live Activity anpasst. Das System zeigt die Activity automatisch in drei Modi an: kompakt (Symbol + kurzer Text links vom Ausschnitt), minimal (nur Symbol) und erweitert (300pt Rechteck mit Informationen). Der Entwickler steuert diese Modi nicht direkt — das System wählt den Modus basierend auf Priorität und verfügbarem Platz aus.
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 unterstützt Interaktivität — der Benutzer tippt auf den Bereich und gelangt in die App oder öffnet die erweiterte Ansicht. Ein Tipp auf den kompakten Modus wechselt in den erweiterten Modus, und ein Wisch nach links versetzt die Activity in den minimalen Modus. Schaltflächen im erweiterten Modus (Pause/Abbrechen) werden über Link aus SwiftUI verarbeitet — das System startet die App mit einer Deep-Link-URL, die Verarbeitung erfolgt im UIApplicationDelegate.
Dynamic Island-Einschränkungen: die Breite des erweiterten Modus beträgt bis zu 300pt, der kompakte Text bis zu 30 Zeichen. Farben und Schriftarten entsprechen dem Systemdesign — die Anpassung ist begrenzt. Übergangsanimationen zwischen den Modi sind systemdefiniert und können nicht angepasst werden. Wenn mehrere Apps aktive Activities haben, zeigt Dynamic Island sie mit Priorität basierend auf Startzeit und Inhaltstyp an.
Häufig gestellte Fragen
Ein normales WidgetKit-Widget zeigt statische Informationen an und wird über einen System-Timer mit einem Mindestintervall von 15–30 Minuten aktualisiert. Live Activity zeigt dynamische Daten in Echtzeit auf dem Sperrbildschirm und Dynamic Island an. Live Activity wird von der App gestartet, lebt bis zu 8 Stunden und wird vom System nach Ende des Ereignisses beendet, im Gegensatz zu einem Widget, das permanent existiert.
Live Activity unterstützt zwei Aktualisierungsmodi: lokal — die App aktualisiert den Zustand über die ActivityKit-API jederzeit, und Push-Update — der Server sendet eine ActivityKit-Push-Benachrichtigung, die das System in einen neuen Widget-Zustand umwandelt. Bei niedrigem Akkustand kann das System die Live Activity einfrieren, bis das Ladegerät angeschlossen wird.
Live Activities sind auf iPhones mit iOS 16.1 und neuer verfügbar. Auf iPhone 14 Pro und neuer wird Live Activity auch in Dynamic Island angezeigt. Auf dem iPad wird Live Activity nur auf dem Sperrbildschirm unterstützt — Dynamic Island ist auf dem iPad nicht verfügbar. Die Apple Watch unterstützt Live Activities nicht direkt, kann aber Abschlussbenachrichtigungen anzeigen.
Das System begrenzt die Anzahl aktiver Live Activities — in der Regel nicht mehr als 5 gleichzeitig für alle Apps. Der Versuch, über das Limit hinaus zu starten, gibt einen Fehler von ActivityKit zurück. Jede Live Activity kann mehrere Zustände haben — zum Beispiel ausstehend, unterwegs, geliefert für eine Essensbestellung. Nach Abschluss bleibt die Activity noch 4 Stunden in der UI.
Ja, die App muss die Erlaubnis zum Senden von Benachrichtigungen anfordern — Live Activity verwendet den Systembenachrichtigungskanal. Der Benutzer kann Live Activity für eine bestimmte App in den Einstellungen deaktivieren. Beim ersten Start zeigt ActivityKit einen Dialog zur Anforderung der Erlaubnis an. Ohne Erlaubnis schlägt die Activity-Anfrage fehl.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch