# Live Activities sur iOS

<Aside type="tip">
Regardez une vidéo sur les Live Activities d'iOS
<YouTube id="jRrDh_pIZCE" playlabel="Vidéo Youtube : Live Activities sur iOS" /> 
</Aside>


Les [Live Activities](https://developer.apple.com/design/human-interface-guidelines/live-activities) affichent les données les plus récentes de votre application sur l'écran de verrouillage de l'iPhone ou de l'iPad et dans la Dynamic Island. Cette fonctionnalité permet aux utilisateurs de voir des informations en direct d'un seul coup d'œil et d'effectuer des actions rapides liées aux informations affichées.

Voici quelques exemples d'utilisation des Live Activities :

*   Afficher le statut d'une commande dans une application de livraison ;
*   Fournir un compte à rebours en temps réel dans une application d'entraînement ;
*   Afficher les informations de suivi dans une application de taxi ;
*   Afficher les statistiques de jeu et les scores actuels dans une application de sport ;
*   Fournir des prévisions horaires dans une application météo.

Vous pouvez activer les Live Activities à l'aide du SDK Pushwoosh pour iOS comme décrit ci-dessous. Pour gérer les Live Activities et mettre à jour leur contenu, utilisez la méthode [/updateLiveActivity](/fr/developer/api-reference/ios-live-activities-api#updateliveactivity).



## Configuration 
<Aside type="caution" title="Important" >
Les Live Activities dans Pushwoosh ne prennent en charge que la [configuration basée sur un token](/fr/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/). La [configuration basée sur un certificat](/fr/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) n'est pas prise en charge.
</Aside> 

### Ajouter une extension de widget

1.  Créer une nouvelle cible

Allez dans **Fichier > Nouveau > Cible** et sélectionnez **Extension de widget**.

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

2.  Configuration de l'extension de widget
Veuillez saisir un nom et assurez-vous de sélectionner **Inclure une Live Activity** et de cliquer sur **Terminer**.

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

###  Configuration de Info.plist
Trouvez le fichier Info.plist dans la cible principale, insérez la clé "Supports Live Activities" et définissez sa valeur sur YES.

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

###  Activation des Live Activities depuis l'application
Pour activer les Live Activities, ajoutez leur code à votre extension de widget existante ou créez-en une nouvelle si votre application n'en a pas déjà. Les Live Activities utilisent les fonctionnalités de [SwiftUI](https://developer.apple.com/documentation/SwiftUI) et [WidgetKit](https://developer.apple.com/documentation/WidgetKit) pour leur interface utilisateur. ActivityKit gère le cycle de vie de chaque Live Activity : son API est utilisée pour demander, mettre à jour et terminer une Live Activity et pour recevoir des notifications push ActivityKit. Vous pouvez en apprendre davantage sur les Live Activities dans la [documentation d'Apple](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).

 1. Accédez au fichier ContentView de votre projet dans Xcode et créez un bouton

```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. Créez un fichier LiveActivityManager.swift pour gérer les Live Activities

```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. C'est tout, maintenant nous exécutons le projet et appuyons sur le bouton 'Démarrer la Live Activity'. Ensuite, nous allons sur l'écran de verrouillage et voyons la Live Activity créée.


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

### Démarrer une Live Activity avec une notification push à distance

1.  Pour lancer une Live Activity via une notification push à distance, vous devez envoyer le token pushToStartTokenUpdates à Pushwoosh.

```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.  Lancer une Live Activity avec une notification push à distance

<Aside type="tip">
 Suivez notre [référence de l'API Pushwoosh](/fr/developer/api-reference/ios-live-activities-api#startliveactivity) pour des instructions et des exemples sur la manière de faire une requête pour démarrer une Live Activity à distance.
</Aside>

### Gérer les Live Activities 

Le SDK Pushwoosh pour iOS fournit les méthodes suivantes pour travailler avec les Live Activities :

```swift
// Envoyer le token Push To Start de la Live Activity à Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Méthodes pour démarrer une Live Activity avec un Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Méthodes pour arrêter une Live Activity
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

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

// Planifier le démarrage d'une Live Activity à une date ultérieure (iOS 26.0+)
static func schedule<Attributes: PushwooshLiveActivityAttributes>(attributes: Attributes, contentState: Attributes.ContentState, at startDate: Date, alertTitle: String, alertBody: String) throws -> Activity<Attributes>

// Annuler une Live Activity planifiée ou en cours par son Activity ID (iOS 16.2+)
static func cancel<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type, activityId: String)

```

Vous pouvez également mettre à jour les Live Activities par segments en utilisant le paramètre Activity ID. Lors de la création d'une activité, vous devez passer un paramètre Activity ID unique dans la méthode, qui sera pertinent pour un segment d'utilisateurs spécifique.

Par exemple, N utilisateurs se sont abonnés au même événement dans une Live Activity. Il est nécessaire que le paramètre Activity ID soit unique pour tous ces N utilisateurs.

Lorsque vous avez terminé de travailler avec une Live Activity, utilisez ces méthodes :
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 Vous pouvez gérer les Live Activities d'iOS via [l'API Pushwoosh](/fr/developer/api-reference/ios-live-activities-api).
</Aside>

### Planifier le démarrage d'une Live Activity à une date ultérieure

<Aside type="note">
Nécessite iOS 26.0+.
</Aside>

Au lieu de démarrer une Live Activity immédiatement, vous pouvez la planifier pour qu'elle démarre à une date ultérieure. `alertTitle` et `alertBody` sont affichés à l'utilisateur dans l'alerte de notification locale qui se déclenche lorsque l'activité planifiée démarre réellement :

```swift
if #available(iOS 26.0, *) {
    let startDate = Date().addingTimeInterval(3600) // démarre dans 1 heure

    do {
        let activity = try Pushwoosh.LiveActivities.schedule(
            attributes: atttribute,
            contentState: initialState,
            at: startDate,
            alertTitle: "Game starting!",
            alertBody: "The match is about to begin"
        )
        self.currentActivity = activity
    } catch {
        print("Schedule Activity Error: \(error.localizedDescription)")
    }
}
```

`startDate` doit être dans le futur, sinon l'appel lève une exception. Appelez `schedule` sur le thread principal lorsque l'application est au premier plan. Il n'y a pas de requête de planification à Pushwoosh : le serveur prend connaissance de l'activité une fois qu'elle démarre réellement et reçoit son token push via le même observateur de token installé par la méthode `setup()` (voir ci-dessous).

### Annuler une Live Activity par son Activity ID

<Aside type="note">
Nécessite iOS 16.2+.
</Aside>

Utilisez `cancel(_:activityId:)` pour annuler une Live Activity par son Activity ID sans détenir de référence à l'instance `Activity` :

```swift
if #available(iOS 16.2, *) {
    Pushwoosh.LiveActivities.cancel(FoodDeliveryAttributes.self, activityId: "activity_id")
}
```

`cancel` termine l'activité sur l'appareil immédiatement et notifie le serveur Pushwoosh. Cela diffère de `stopLiveActivity(activityId:)`, qui ne fait que notifier le serveur et ne termine pas directement l'activité sur l'appareil. `cancel` fonctionne également pour une Live Activity qui a été planifiée avec `schedule` mais n'a pas encore commencé — elle est annulée avant même de démarrer.

### Méthode `Setup()`.
Pushwoosh simplifie le transfert des ID d'activité en introduisant la fonction `PushwooshLiveActivities.setup`, qui gère l'ensemble du cycle de vie d'une Live Activity au sein de l'application. Cette fonction écoute automatiquement les mises à jour des tokens pushToStart et pushToUpdate. En utilisant cette méthode, l'application n'a plus besoin de suivre manuellement le lancement des Live Activities ou de gérer les mises à jour des tokens pour les mises à jour d'activité.

Nous recommandons d'utiliser cette méthode car elle gère toute la gestion des tokens de notre côté, ce qui réduit la quantité de code que vous devez maintenir de votre côté. Cela simplifie l'intégration et garantit une expérience plus fluide et plus efficace pour votre application.

Dans l'AppDelegate, assurez-vous d'importer `PushwooshFramework` et `PushwooshLiveActivities` et d'appeler la méthode `setup` du module `Pushwoosh.LiveActivities`.

**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` : Cette structure est conforme au protocole `PushwooshLiveActivityAttributes`. Elle est utilisée pour définir les attributs d'une Live Activity au sein de l'application.

<Aside type="note">
 Vous pouvez gérer les Live Activities et mettre à jour leur contenu en utilisant la méthode /updateLiveActivity de l'API Pushwoosh. Pour plus d'informations, veuillez lire [ce guide](/fr/developer/api-reference/ios-live-activities-api)
</Aside>

## Guide de migration

À partir de la version 6.8.0 du SDK Pushwoosh pour iOS, nous avons mis à jour la structure du SDK. Les méthodes des Live Activities sont désormais accessibles via le module `PushwooshLiveActivities`.

Si vous utilisiez une version du SDK Pushwoosh pour iOS antérieure à la 6.8.0 et que vous appeliez les méthodes listées ci-dessous, et que vous avez depuis mis à jour vers la version 6.8.0 ou ultérieure, veuillez noter les changements suivants :

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

Désormais, pour accéder à ces méthodes, vous devez utiliser le module LiveActivity.

```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"])
```

Nous avons également maintenu la prise en charge des méthodes via `Pushwoosh.sharedInstance()` comme indiqué ci-dessous, mais veuillez noter que ces méthodes seront dépréciées dans les futures versions.

``` swift
// Envoyer le token Push To Start de la Live Activity à Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Méthodes pour démarrer une Live Activity avec un Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Méthodes pour arrêter une Live Activity
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

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