# Suivi de la livraison des messages iOS

Il existe une [méthode d'API](/fr/developer/api-reference/device-api#messagedeliveryevent) dans Pushwoosh qui suit la livraison des notifications push. Les applications iOS ne prennent pas en charge cette méthode nativement, car les notifications push sur iOS sont gérées par le système d'exploitation (OS), et non par le SDK Pushwoosh. Vous pouvez ajouter le suivi de la livraison en ajoutant une Extension de service de notification à votre projet. Cette page montre comment implémenter le suivi de la livraison des messages pour les applications iOS.

<Aside>
Nécessite le SDK Pushwoosh pour iOS 7.x, qui prend en charge iOS 13.0 et versions ultérieures.
</Aside>

<Aside type="note">
Depuis la version 7.1.0 du SDK Pushwoosh pour iOS, l'intégration recommandée est la classe de base `PushwooshNotificationServiceExtension` prête à l'emploi, présentée ci-dessous. Elle envoie l'événement de livraison de message, définit le badge, télécharge la pièce jointe multimédia et gère pour vous le repli obligatoire `serviceExtensionTimeWillExpire`. L'ancienne API `PWNotificationExtensionManager` fonctionne toujours mais est obsolète — voir [Intégration héritée](#legacy-integration).
</Aside>

## Ajouter une Extension de service de notification

1. Dans Xcode, sélectionnez **File** > **New** > **Target...**

2. Sélectionnez **Notification Service Extension** et cliquez sur **Next.**

<img src="/ios-push-notifications-ios-message-delivery-tracking-1.webp" alt="Sélecteur de modèle de cible Xcode avec l'Extension de service de notification sélectionnée"/>

3. Entrez le nom du produit et cliquez sur **Finish.**

<Aside type="caution">
Ne sélectionnez pas **Activate** dans la boîte de dialogue qui s'affiche après avoir cliqué sur **Finish**.
</Aside>

4. Cliquez sur **Cancel** à l'invite **Activate scheme**.

<img
  src="/ios-push-notifications-ios-message-delivery-tracking-2.webp"
  alt="Invite d'activation du schéma avec Annuler en surbrillance"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

En annulant, vous conservez le débogage de votre application par Xcode au lieu de celui de l'extension que vous venez de créer. Si vous l'avez activée par accident, vous pouvez revenir au débogage de votre application dans Xcode.

## Dépendances pour l'Extension de service de notification (CocoaPods uniquement)

Si vous utilisez Swift Package Manager pour gérer les dépendances, vous pouvez sauter cette étape, car les dépendances sont ajoutées automatiquement.

Ouvrez votre `Podfile` et ajoutez la dépendance pour la cible :

```ruby title="Podfile"
target 'NotificationServiceExtension' do
  use_frameworks!
  pod 'PushwooshXCFramework'
end
```

Exécutez les commandes suivantes dans le terminal pour installer les dépendances :

```shell
rm -rf Podfile.lock
pod deintegrate
pod setup
pod repo update
pod install
```

## Ajouter le code pour le suivi des événements de livraison de message

Faites de votre extension une sous-classe de `PushwooshNotificationServiceExtension`. Une sous-classe vide est suffisante : Pushwoosh envoie l'événement de livraison de message, définit le badge, télécharge la pièce jointe multimédia et gère automatiquement le repli en cas d'expiration.

Remplacez le contenu généré de votre fichier **NotificationService** :

<Tabs>
<TabItem label="Swift">

```swift
import UserNotifications
import PushwooshFramework

class NotificationService: PushwooshNotificationServiceExtension {}
```

</TabItem>

<TabItem label="Objective-C">

```objective-c
#import <PushwooshFramework/PushwooshNotificationServiceExtension.h>

@interface NotificationService : PushwooshNotificationServiceExtension

@end

@implementation NotificationService

@end
```

</TabItem>
</Tabs>

<Aside type="tip">
Si vous n'avez besoin d'aucun code personnalisé, vous pouvez ignorer complètement le fichier source et faire pointer la clé `NSExtensionPrincipalClass` de l'Info.plist de l'extension directement vers `PushwooshNotificationServiceExtension`.
</Aside>

### ID de l'application

Depuis la version 7.1.0, l'extension hérite de `Pushwoosh_APPID` (et d'autres clés `Pushwoosh_*`) de l'Info.plist de l'application hôte, vous n'avez donc plus besoin de la dupliquer dans l'extension. N'ajoutez `Pushwoosh_APPID` à l'Info.plist de l'extension que si vous souhaitez remplacer la valeur de l'hôte :

```xml title="NotificationService/Info.plist"
<key>Pushwoosh_APPID</key>
<string>XXXXX-XXXXX</string>
```

<Aside type="note">
Sur les versions du SDK Pushwoosh pour iOS antérieures à la 7.1.0, l'extension n'hérite pas de la configuration de l'application hôte. Sur ces versions, vous devez ajouter `Pushwoosh_APPID` à l'Info.plist de l'extension.
</Aside>

### Groupe d'applications (badge et proxy inverse)

Un Groupe d'applications (App Group) partagé entre l'application et l'extension est nécessaire pour synchroniser le compteur du badge et pour lire les paramètres du proxy inverse que l'application hôte stocke.

1. Ajoutez la capacité **App Groups** à la cible de l'extension et activez-y le même groupe que dans l'application hôte. Ceci est obligatoire — sans le conteneur partagé, le compteur du badge et les paramètres du proxy inverse ne peuvent pas être synchronisés.

2. Fournissez le nom du Groupe d'applications. Comme pour `Pushwoosh_APPID`, l'extension hérite de `PW_APP_GROUPS_NAME` de l'Info.plist de l'application hôte depuis la version 7.1.0. Si vous l'avez déjà défini à cet endroit pour les badges, vous n'avez pas besoin de l'ajouter à l'extension. Ne le définissez dans l'Info.plist de l'extension que pour remplacer la valeur de l'hôte, ou fournissez-le par programmation en surchargeant `pushwooshAppGroupsName`.

```xml title="App Info.plist"
<key>PW_APP_GROUPS_NAME</key>
<string>group.com.example.app</string>
```

<Aside type="caution">
Si l'application hôte utilise un proxy inverse (`Pushwoosh_ALLOW_REVERSE_PROXY`), l'extension a besoin de ce Groupe d'applications pour lire l'URL du proxy que l'application y a stockée. Sans cela, l'événement de livraison est retenu au lieu d'être envoyé directement, contournant ainsi le proxy.
</Aside>

## Personnaliser la notification (optionnel)

La classe de base expose quelques points de surcharge, du moins au plus grand contrôle. Pushwoosh exécute toujours l'événement de livraison, le badge, la pièce jointe et le repli en cas d'expiration dans tous les cas.

Définissez le Groupe d'applications par programmation au lieu d'utiliser la clé de l'Info.plist :

```swift
override func pushwooshAppGroupsName() -> String? {
    "group.com.example.app"
}
```

Exécutez une préparation asynchrone avant que Pushwoosh ne traite le push — par exemple, le préchargement des médias des Push Stories — sans surcharger la méthode standard `didReceive`. Appelez `completion` une seule fois, sur le thread principal :

```swift
override func pushwooshPrepare(for request: UNNotificationRequest,
                              completion: @escaping () -> Void) {
    // async work here
    completion()
}
```

Modifiez le contenu avant qu'il ne soit affiché en surchargeant `didReceive`. Appelez `super` avec votre propre gestionnaire de contenu, modifiez le contenu à l'intérieur, puis transmettez-le au gestionnaire d'origine :

```swift
override func didReceive(_ request: UNNotificationRequest,
                         withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    super.didReceive(request) { content in
        let mutable = (content.mutableCopy() as? UNMutableNotificationContent) ?? content
        // customize `mutable` here
        contentHandler(mutable)
    }
}
```

## Intégration héritée

<Aside type="caution">
`PWNotificationExtensionManager` est obsolète depuis la version 7.1.0. Utilisez-le uniquement si vous ne pouvez pas créer une sous-classe de `PushwooshNotificationServiceExtension` — par exemple, une extension qui hérite déjà d'une autre classe de base de SDK, ou un wrapper multiplateforme (React Native, Flutter, Unity). Les nouvelles intégrations doivent utiliser la classe de base ci-dessus.
</Aside>

Cette API de bas niveau pilote le même traitement (événement de livraison, badge, pièce jointe) à partir d'une simple `UNNotificationServiceExtension` :

<Tabs>
<TabItem label="Swift">

```swift
import UserNotifications
import PushwooshFramework

class NotificationService: UNNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
                             withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        PWNotificationExtensionManager.sharedManager()
            .handleNotificationRequest(request, contentHandler: contentHandler)
    }
}
```

</TabItem>

<TabItem label="Objective-C">

```objective-c
#import "PWNotificationExtensionManager.h"

@interface NotificationService : UNNotificationServiceExtension

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent *))contentHandler {
    [[PWNotificationExtensionManager sharedManager] handleNotificationRequest:request
                                                              contentHandler:contentHandler];
}

@end
```

</TabItem>
</Tabs>

## Partagez vos commentaires avec nous

Vos commentaires nous aident à créer une meilleure expérience, nous serions donc ravis de vous entendre si vous rencontrez des problèmes lors du processus d'intégration du SDK. Si vous rencontrez des difficultés, n'hésitez pas à nous faire part de vos réflexions [via ce formulaire](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).