# iOS Live-Aktivitäten

<Aside type="tip">
Sehen Sie sich ein Video über iOS Live-Aktivitäten an
<YouTube id="jRrDh_pIZCE" playlabel="YouTube-Video: iOS Live-Aktivitäten" /> 
</Aside>


[Live-Aktivitäten](https://developer.apple.com/design/human-interface-guidelines/live-activities) zeigen die aktuellsten Daten Ihrer App auf dem iPhone- oder iPad-Sperrbildschirm und in der Dynamic Island an. Diese Funktion ermöglicht es Benutzern, Live-Informationen auf einen Blick zu sehen und schnelle Aktionen im Zusammenhang mit den angezeigten Informationen durchzuführen.

Hier sind einige Beispiele für die Verwendung von Live-Aktivitäten:

* Bestellstatus in einer Liefer-App anzeigen;
* Einen Echtzeit-Countdown in einer Trainings-App bereitstellen;
* Tracking-Informationen in einer Taxi-App anzeigen;
* Spielstatistiken und aktuelle Spielstände in einer Sport-App anzeigen;
* Stündliche Vorhersagen in einer Wetter-App bereitstellen.

Sie können Live-Aktivitäten mit dem Pushwoosh iOS SDK wie unten beschrieben aktivieren. Um Live-Aktivitäten zu verwalten und deren Inhalt zu aktualisieren, verwenden Sie die Methode [/updateLiveActivity](/de/developer/api-reference/ios-live-activities-api#updateliveactivity).



## Einrichtung 
<Aside type="caution" title="Wichtig" >
Live-Aktivitäten in Pushwoosh unterstützen nur die [tokenbasierte Konfiguration](/de/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/). Die [zertifikatbasierte Konfiguration](/de/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) wird nicht unterstützt.
</Aside> 

### Eine Widget Extension hinzufügen

1. Ein neues Ziel erstellen

Gehen Sie zu **Datei > Neu > Ziel** und wählen Sie **Widget Extension** aus.

<img src="/ios-push-notifications-ios-live-activities-1.webp" alt=""/>

2. Konfiguration der Widget Extension
Bitte geben Sie einen Namen ein und stellen Sie sicher, dass Sie **Live Activity einschließen** auswählen und auf **Fertig stellen** klicken.

<img src="/ios-push-notifications-ios-live-activities-2.webp" alt=""/>

###  Info.plist-Konfiguration
Suchen Sie die Info.plist-Datei im primären Ziel, fügen Sie den Schlüssel "Supports Live Activities" ein und setzen Sie dessen Wert auf YES.

```xml
	<key>NSSupportsLiveActivities</key>
	<true/>
```

###  Live-Aktivitäten aus der App aktivieren
Um Live-Aktivitäten zu aktivieren, fügen Sie deren Code zu Ihrer bestehenden Widget Extension hinzu oder erstellen Sie eine neue, falls Ihre App noch keine hat. Live-Aktivitäten verwenden die Funktionalität von [SwiftUI](https://developer.apple.com/documentation/SwiftUI) und [WidgetKit](https://developer.apple.com/documentation/WidgetKit) für ihre Benutzeroberfläche. ActivityKit handhabt den Lebenszyklus jeder Live-Aktivität: Die API wird verwendet, um eine Live-Aktivität anzufordern, zu aktualisieren und zu beenden sowie um ActivityKit-Push-Benachrichtigungen zu erhalten. Mehr über Live-Aktivitäten erfahren Sie in der [Apple-Dokumentation](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).

 1. Navigieren Sie zur ContentView-Datei Ihres Projekts in Xcode und erstellen Sie einen Button

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 20) {

            Button(action: {
                LiveActivityManager.shared.startActivity()
            }, label: {
                Text("Start Live Activity")
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
<img src="/ios-push-notifications-ios-live-activities-4.webp" alt=""/>

 2. Erstellen Sie eine LiveActivityManager.swift-Datei zur Verwaltung von Live-Aktivitäten

```swift
import Foundation
import ActivityKit
import UIKit
import PushwooshFramework
import PushwooshLiveActivities

class LiveActivityManager: NSObject, ObservableObject {
    public static let shared: LiveActivityManager = LiveActivityManager()

    private var currentActivity: Activity<FoodDeliveryAttributes>? = nil

    override init() {
        super.init()
    }

    func startActivity() {
        guard ActivityAuthorizationInfo().areActivitiesEnabled else {
            print("You can't start live activity.")
            return
        }
        do {
            let pushwooshData = PushwooshLiveActivityAttributeData(activityId: "activity_id")
            let atttribute = FoodDeliveryAttributes(orderNumber: "1234567", pushwoosh: pushwooshData)
            let initialState = FoodDeliveryAttributes.ContentState(
                status: "Preparing your meal",
                estimatedTime: "25 min",
                emoji: "👨‍🍳",
                pushwoosh: nil
            )
            let activity = try Activity<FoodDeliveryAttributes>.request(
                attributes: atttribute,
                content: .init(state:initialState , staleDate: nil),
                pushType: .token
            )
            self.currentActivity = activity

            Task {
                for await pushToken in activity.pushTokenUpdates {
                    let pushTokenString = pushToken.reduce("") {
                        $0 + String(format: "%02x", $1)
                    }
                    print("Activity:\(activity.id) push token: \(pushTokenString)")

                    // MARK: - Send Push Token to Pushwoosh
                    Pushwoosh.LiveActivities.startLiveActivity(
                        token: pushTokenString,
                        activityId: "activity_id"
                    )
                }
            }
        } catch {
            print("Start Activity Error: \(error.localizedDescription)")
        }
    }
}

```

 3. Das ist alles. Führen Sie nun das Projekt aus und drücken Sie die Schaltfläche 'Start Live Activity'. Navigieren Sie dann zum Sperrbildschirm, um die erstellte Live-Aktivität zu sehen.


<img src="/live-activities-1.webp" alt=""/>

### Eine Live-Aktivität mit einer Remote-Push-Benachrichtigung starten

1. Um eine Live-Aktivität über eine Remote-Push-Benachrichtigung zu initiieren, müssen Sie das `pushToStartTokenUpdates`-Token an Pushwoosh senden.

```swift
func getPushToStartToken() {
    if #available(iOS 17.2, *) {
        Task {
            for await data in Activity<LiveActivityAttributes>.pushToStartTokenUpdates {
                let token = data.map {String(format: "%02x", $0)}.joined()
                print("Activity PushToStart Token: \(token)")

                // Send `pushToStartTokenUpdates` token to Pushwoosh
                try await Pushwoosh.LiveActivities.sendPushToStartLiveActivity(token: token)
            }
        }
    }
}
```
2. Eine Live-Aktivität mit einer Remote-Push-Benachrichtigung initiieren

<Aside type="tip">
 Folgen Sie unserer [Pushwoosh API-Referenz](/de/developer/api-reference/ios-live-activities-api#startliveactivity) für Anweisungen und Beispiele, wie Sie eine Anfrage zum Fernstart einer Live-Aktivität stellen.
</Aside>

### Live-Aktivitäten verwalten 

Das Pushwoosh iOS SDK bietet die folgenden Methoden für die Arbeit mit Live-Aktivitäten:

```swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)

```

Sie können Live-Aktivitäten auch nach Segmenten aktualisieren, indem Sie den Activity ID-Parameter verwenden. Beim Erstellen einer Aktivität müssen Sie einen eindeutigen Activity ID-Parameter in der Methode übergeben, der für ein bestimmtes Benutzersegment relevant ist.

Zum Beispiel haben N Benutzer dasselbe Ereignis in einer Live-Aktivität abonniert. Es ist notwendig, dass der Activity ID-Parameter für alle diese N Benutzer eindeutig ist.

Wenn Sie die Arbeit mit einer Live-Aktivität beendet haben, verwenden Sie diese Methoden:
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 Sie können iOS Live-Aktivitäten über die [Pushwoosh API](/de/developer/api-reference/ios-live-activities-api) verwalten.
</Aside>

### `Setup()`-Methode.
Pushwoosh vereinfacht die Übertragung von Aktivitäts-IDs durch die Einführung der `PushwooshLiveActivities.setup`-Funktion, die den gesamten Lebenszyklus einer Live-Aktivität innerhalb der Anwendung verwaltet. Diese Funktion lauscht automatisch auf `pushToStart`- und `pushToUpdate`-Token-Aktualisierungen. Durch die Verwendung dieser Methode muss die Anwendung nicht mehr manuell die Initiierung von Live-Aktivitäten verfolgen oder Token-Aktualisierungen für Aktivitäts-Updates verwalten. 

Wir empfehlen die Verwendung dieser Methode, da sie die gesamte Token-Verwaltung auf unserer Seite übernimmt und so den Code, den Sie auf Ihrer Seite pflegen müssen, reduziert. Dies vereinfacht die Integration und sorgt für ein reibungsloseres und effizienteres Erlebnis für Ihre App.

Stellen Sie im AppDelegate sicher, dass Sie `PushwooshFramework` und `PushwooshLiveActivities` importieren und die `setup`-Methode aus dem `Pushwoosh.LiveActivities`-Modul aufrufen.

**AppDelegate.swift**
```swift
if #available(iOS 16.1, *) {
    Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
}
```
**FoodDeliveryAttributes**

```swift
import WidgetKit
import SwiftUI
import ActivityKit
import PushwooshFramework
import PushwooshLiveActivities

struct FoodDeliveryAttributes: PushwooshLiveActivityAttributes {
    public struct ContentState: PushwooshLiveActivityContentState {
        var status: String
        var estimatedTime: String
        var emoji: String
        var pushwoosh: PushwooshLiveActivityContentStateData?
    }

    var orderNumber: String
    var pushwoosh: PushwooshLiveActivityAttributeData
}
```
`FoodDeliveryAttributes`: Diese Struktur entspricht dem `PushwooshLiveActivityAttributes`-Protokoll. Sie wird verwendet, um die Attribute einer Live-Aktivität innerhalb der App zu definieren.

<Aside type="note">
 Sie können Live-Aktivitäten verwalten und deren Inhalt mit der /updateLiveActivity-Methode der Pushwoosh API aktualisieren. Weitere Informationen finden Sie in [diesem Leitfaden](/de/developer/api-reference/ios-live-activities-api)
</Aside>

## Migrationsleitfaden

Ab Version 6.8.0 des Pushwoosh iOS SDK haben wir die SDK-Struktur aktualisiert. Auf die Methoden für Live-Aktivitäten wird jetzt über das `PushwooshLiveActivities`-Modul zugegriffen.

Wenn Sie eine Version des Pushwoosh iOS SDK vor 6.8.0 verwendet und die unten aufgeführten Methoden aufgerufen haben und seitdem auf Version 6.8.0 oder höher aktualisiert haben, beachten Sie bitte die folgenden Änderungen:

```swift
static func setup<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type)
static func defaultSetup()
static func defaultStart(_ activityId: String, attributes: [String: Any], content: [String: Any])
```

Um auf diese Methoden zuzugreifen, sollten Sie jetzt das LiveActivity-Modul verwenden.

```swift
import PushwooshFramework
import PushwooshLiveActivities

```

```swift
Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
Pushwoosh.LiveActivities.defaultSetup()
Pushwoosh.LiveActivities.defaultStart("activity_id",
                            attributes: ["key_attribute": "value_attribute"],
                            content: ["key_content": "value_content"])
```

Wir haben auch die Unterstützung für die unten aufgeführten Methoden über `Pushwoosh.sharedInstance()` beibehalten, aber bitte beachten Sie, dass diese Methoden in zukünftigen Versionen veraltet sein werden.

``` swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)
```