# Guide d'intégration de base du SDK iOS 7.0+

Cette section contient des informations sur la manière d'intégrer le SDK Pushwoosh dans votre application iOS.

## Prérequis

Pour intégrer le SDK iOS de Pushwoosh dans votre application, vous aurez besoin des éléments suivants :

<TranslatedFragment id="prerequisites-ios" />

## Étapes d'intégration

### 1. Installation

Vous pouvez intégrer le SDK Pushwoosh dans votre application en utilisant soit le **Swift Package Manager**, soit **CocoaPods**.

#### Swift Package Manager

Dans la section **Package Dependencies**, ajoutez le paquet suivant :
```
https://github.com/Pushwoosh/Pushwoosh-XCFramework
```

Pour utiliser le SDK iOS de Pushwoosh, assurez-vous d'ajouter les trois frameworks suivants à la cible de votre application lors de l'intégration via le Swift Package Manager :

* ```PushwooshFramework```
* ```PushwooshCore```
* ```PushwooshBridge```

<img src="/ios-spm-1.webp" alt=""/>

#### CocoaPods

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

```bash
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  pod 'PushwooshXCFramework'

end
```

Ensuite, dans le terminal, exécutez la commande suivante pour installer les dépendances :
```bash
pod install
```

### 2. Capacités

Pour activer les notifications Push dans votre projet, vous devez ajouter certaines capacités.

Dans la section Signing & Capabilities, ajoutez les capacités suivantes :
- `Push Notifications`
- `Background Modes`. Après avoir ajouté cette capacité, cochez la case `Remote notifications`.

Si vous prévoyez d'utiliser les notifications urgentes (Time Sensitive Notifications) (iOS 15+), ajoutez également la capacité `Time Sensitive Notifications`.


### 3. Code d'initialisation

#### AppDelegate

Ajoutez le code suivant à votre classe AppDelegate :

<Tabs syncKey="code-example">
<TabItem label="SwiftUI">
```swift
import SwiftUI
import PushwooshFramework

@main
struct MyApp: App {
    // Enregistrer AppDelegate comme UIApplicationDelegate
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Code d'initialisation
        // Définir un délégué personnalisé pour la gestion des pushs
        Pushwoosh.configure.delegate = self

        // S'inscrire aux notifications push
        Pushwoosh.configure.registerForPushNotifications()

        return true
    }

    // Gérer le jeton reçu d'APNS
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    // Gérer l'erreur de réception du jeton
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error)
    }

    // pour les notifications push silencieuses
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        Pushwoosh.configure.handlePushReceived(userInfo)
        completionHandler(.noData)
    }

    // Déclenché lorsqu'un push est reçu
    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageReceived message: PWMessage) {
        print("onMessageReceived: ", message.payload!.description)
    }

    // Déclenché lorsqu'un utilisateur appuie sur la notification
    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("onMessageOpened: ", message.payload!.description)
    }
}

struct ContentView: View {
    var body: some View {
        Text("Pushwoosh with SwiftUI")
            .padding()
    }
}
```
</TabItem>

<TabItem label="Swift">
```swift
import PushwooshFramework

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, PWMessagingDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // code d'initialisation
        // définir un délégué personnalisé pour la gestion des pushs, dans notre cas AppDelegate
        Pushwoosh.configure.delegate = self;

        // s'inscrire aux notifications push
        Pushwoosh.configure.registerForPushNotifications()

        return true
    }

    // gérer le jeton reçu d'APNS
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    // gérer l'erreur de réception du jeton
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error);
    }

    // pour les notifications push silencieuses
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        Pushwoosh.configure.handlePushReceived(userInfo)
        completionHandler(.noData)
    }

    // cet événement est déclenché lorsque le push est reçu
    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageReceived message: PWMessage) {
        print("onMessageReceived: ", message.payload!.description)
    }

    // Déclenché lorsqu'un utilisateur appuie sur la notification
    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("onMessageOpened: ", message.payload!.description)
    }
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	//-----------PARTIE PUSHWOOSH-----------

	// définir un délégué personnalisé pour la gestion des pushs, dans notre cas AppDelegate
	[Pushwoosh configure].delegate = self;

	// s'inscrire aux notifications push !
	[[Pushwoosh configure] registerForPushNotifications];

	return YES;
}

// gérer le jeton reçu d'APNS
- (void)application:(UIApplication *)application
	didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
	[[Pushwoosh configure] handlePushRegistration:deviceToken];
}

// gérer l'erreur de réception du jeton
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
	[[Pushwoosh configure] handlePushRegistrationFailure:error];
}

// pour les notifications push silencieuses
- (void)application:(UIApplication *)application
	didReceiveRemoteNotification:(NSDictionary *)userInfo
		  fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
		[[Pushwoosh configure] handlePushReceived:userInfo];
		completionHandler(UIBackgroundFetchResultNoData);
}

// cet événement est déclenché lorsque le push est reçu
- (void)pushwoosh:(Pushwoosh *)pushwoosh onMessageReceived:(PWMessage *)message {
    NSLog(@"onMessageReceived: %@", message.payload);
}

// cet événement est déclenché lorsque l'utilisateur appuie sur la notification
- (void)pushwoosh:(Pushwoosh *)pushwoosh onMessageOpened:(PWMessage *)message {
    NSLog(@"onMessageOpened: %@", message.payload);
}

@end
```
</TabItem>
</Tabs>

#### Info.plist

Dans votre `Info.plist` :
- définissez la clé `Pushwoosh_APPID` sur le code d'application Pushwoosh.
- définissez la clé `Pushwoosh_API_TOKEN` sur le [jeton d'API de l'appareil Pushwoosh](/fr/developer/api-reference/api-access-token/#device-api-token)

### 4. Suivi de la livraison des messages

Pushwoosh prend en charge le suivi des événements de livraison pour les notifications push via l'extension de service de notification (Notification Service Extension).

#### Ajouter une extension de service de notification

1. Dans Xcode, sélectionnez **File** > **New** > **Target...**
2. Choisissez **Notification Service Extension** et appuyez sur **Next.**
3. Entrez le nom de la cible et appuyez sur **Finish.**
4. Lorsqu'on vous demande de l'activer, appuyez sur **Cancel.**

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

Remarque : Si vous utilisez le 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"
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  pod 'PushwooshXCFramework'

end

target 'MyAppNotificationExtension' do
  use_frameworks!

  pod 'PushwooshXCFramework'

end
```

Exécutez la commande suivante dans le terminal pour mettre à jour les dépendances :

```shell
pod update
```

#### Ajouter le SDK Pushwoosh à l'extension de service de notification

Remplacez la classe `NotificationService` générée par une sous-classe de `PushwooshNotificationServiceExtension`. Pushwoosh gère alors tout ce dont un push a besoin — l'envoi de l'événement de livraison, le comptage des badges, le téléchargement de la pièce jointe multimédia et le repli obligatoire en cas d'expiration du délai `serviceExtensionTimeWillExpire`. Aucun autre code n'est requis.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class NotificationService: PushwooshNotificationServiceExtension {}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@interface NotificationService : PushwooshNotificationServiceExtension
@end

@implementation NotificationService
@end
```
</TabItem>
</Tabs>

Remarque : vous pouvez ignorer complètement le fichier source — définissez la `NSExtensionPrincipalClass` de l'extension sur `PushwooshNotificationServiceExtension` dans son Info.plist et n'écrivez aucun code.

Pour modifier la notification avant qu'elle ne soit affichée, surchargez `didReceive(_:withContentHandler:)`, appelez `super` avec votre propre gestionnaire de contenu, modifiez le contenu à l'intérieur, puis transmettez-le au gestionnaire d'origine. Pushwoosh exécute toujours l'événement de livraison, le badge, la pièce jointe et le repli en cas d'expiration du délai.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import UserNotifications
import PushwooshFramework

class NotificationService: PushwooshNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
                             withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        super.didReceive(request) { content in
            let mutable = (content.mutableCopy() as? UNMutableNotificationContent) ?? content
            // Modifiez le contenu de la notification ici...
            contentHandler(mutable)
        }
    }

}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@interface NotificationService : PushwooshNotificationServiceExtension
@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    [super didReceiveNotificationRequest:request withContentHandler:^(UNNotificationContent *content) {
        UNMutableNotificationContent *mutable = [content mutableCopy];
        // Modifiez le contenu de la notification ici...
        contentHandler(mutable);
    }];
}

@end
```
</TabItem>
</Tabs>

#### Info.plist

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

Pour synchroniser le nombre de badges et les paramètres de proxy inverse avec l'application, partagez un [groupe d'applications (App Group)](/fr/developer/pushwoosh-sdk/ios-sdk/setting-up-badges) entre l'application et l'extension. Ajoutez la capacité App Groups aux deux cibles, puis définissez l'ID du groupe d'applications dans l'Info.plist de l'**application principale** :
- `PW_APP_GROUPS_NAME` - votre identifiant de groupe d'applications (par exemple, `group.com.example.app`).

L'extension hérite de cette valeur de l'application hôte, vous n'avez donc pas besoin de la répéter dans l'Info.plist de l'extension — ne l'ajoutez que pour remplacer l'hôte. Alternativement, fournissez-la dans le code en surchargeant `pushwooshAppGroupsName`.

### 5. Exécuter le projet

1. Compilez et exécutez le projet.
2. Allez dans le panneau de contrôle de Pushwoosh et [envoyez une notification push](/fr/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. Vous devriez voir la notification dans l'application.

## Intégration iOS étendue de Pushwoosh

À ce stade, vous avez déjà intégré le SDK et pouvez envoyer et recevoir des notifications push. Explorons maintenant les fonctionnalités de base.

### Notifications push

Dans le SDK Pushwoosh, il existe deux rappels (callbacks) conçus pour gérer les notifications push :
- `onMessageReceived` : Cette méthode est invoquée lorsqu'une notification push est reçue.
- `onMessageOpened` : Cette méthode est appelée lorsque l'utilisateur interagit avec (ouvre) la notification.

Ces rappels permettent aux développeurs de gérer la réception et l'interaction de l'utilisateur avec les notifications push au sein de leurs applications.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class AppDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        Pushwoosh.configure.delegate = self;
    }

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        if let payload = message.payload {
            print("onMessageOpened: \(payload)")
        }
    }

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageReceived message: PWMessage) {
        if let payload = message.payload {
            print("onMessageReceived: \(payload)")
        }
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@interface AppDelegate () <PWMessagingDelegate>

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[Pushwoosh configure] setDelegate:self];
    return YES;
}

- (void)pushwoosh:(Pushwoosh *)pushwoosh onMessageOpened:(PWMessage *)message {
    if (message.payload) {
        NSLog(@"onMessageOpened: %@", message.payload);
    }
}

- (void)pushwoosh:(Pushwoosh *)pushwoosh onMessageReceived:(PWMessage *)message {
    if (message.payload) {
        NSLog(@"onMessageReceived: %@", message.payload);
    }
}
@end
```
</TabItem>
</Tabs>


### Configuration de l'utilisateur

En vous concentrant sur le comportement et les préférences individuels des utilisateurs, vous pouvez fournir un contenu personnalisé, ce qui entraîne une satisfaction et une fidélité accrues des utilisateurs.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class Registration {

    func afterUserLogin(user: User) {
        let pushwoosh = Pushwoosh.configure
        // définir l'ID utilisateur
        if let userId = user.userId {
            pushwoosh.setUserId(userId)
        }

        // définir l'e-mail de l'utilisateur
        if let userEmail = user.email {
            pushwoosh.setEmail(userEmail)
        }

        // définir le numéro SMS de l'utilisateur
        if let userSmsNumber = user.SmsNumber {
            pushwoosh.registerSmsNumber(userSmsNumber)
        }

        // définir le numéro WhatsApp de l'utilisateur
        if let userWhatsAppNumber = user.WhatsAppNumber {
            pushwoosh.registerSmsNumber(userWhatsAppNumber)
        }

        // définir des informations utilisateur supplémentaires comme tags pour Pushwoosh
        if let age = user.userDetails.age,
            let name = user.userDetails.userName,
            let lastLogin = user.userDetails.lastLoginDate {
            pushwoosh.setTags([
                "age": age,
                "name": name,
                "last_login": lastLogin
            ])
        }
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@implementation Registration

- (void)afterUserLogin:(User *)user {
    Pushwoosh *pushwoosh = [Pushwoosh configure];

    // définir l'ID utilisateur
    if (user.userId) {
        [pushwoosh setUserId:user.userId];
    }

    // définir l'e-mail de l'utilisateur
    if (user.email) {
        [pushwoosh setEmail:user.email];
    }

    // définir des informations utilisateur supplémentaires comme tags pour Pushwoosh
    if (user.userDetails.age && user.userDetails.userName && user.userDetails.lastLoginDate) {
        NSDictionary *tags = @{
            @"age": user.userDetails.age,
            @"name": user.userDetails.userName,
            @"last_login": user.userDetails.lastLoginDate
        };
        [pushwoosh setTags:tags];
    }
}

@end
```
</TabItem>
</Tabs>

### Tags

Les tags sont des paires clé-valeur attribuées aux utilisateurs ou aux appareils, permettant une segmentation basée sur des attributs tels que les préférences ou le comportement, ce qui permet des messages ciblés.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class UpdateUser {
    func afterUserUpdateProfile(user: User) {
        let pushwoosh = Pushwoosh.configure

        // définir la liste des catégories favorites
        pushwoosh.setTags(["favorite_categories" : user.getFavoriteCategories()])

        // définir les informations de paiement
        pushwoosh.setTags([
            "is_subscribed": user.isSubscribed(),
            "payment_status": user.getPaymentStatus(),
            "billing_address": user.getBillingAddress()
        ])
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>

@implementation UpdateUser

- (void)afterUserUpdateProfile:(User *)user {
    Pushwoosh *pushwoosh = [Pushwoosh configure];

    // définir la liste des catégories favorites
    [pushwoosh setTags:@{@"favorite_categories" : user.getFavoriteCategories}];

    // définir les informations de paiement
    NSDictionary *tags = @{
        @"is_subscribed": @(user.isSubscribed),
        @"payment_status": user.getPaymentStatus,
        @"billing_address": user.getBillingAddress
    };
    [pushwoosh setTags:tags];
}

@end
```
</TabItem>
</Tabs>


### Événements

Les événements sont des actions ou des occurrences spécifiques de l'utilisateur au sein de l'application qui peuvent être suivies pour analyser le comportement et déclencher des messages ou des actions correspondants.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class Registration {

    func afterUserLogin(user: User) {
        if let userName = user.getUserName(), let lastLogin = user.getLastLoginDate() {
            PWInAppManager.shared().postEvent("login", withAttributes: [
                "name": userName,
                "last_login": lastLogin
            ])
        }
    }

    func afterUserPurchase(user: User, product: Product) {
        let pushwoosh = Pushwoosh.configure

        // Suivre l'événement d'achat
        PWInAppManager.shared().postEvent("purchase", withAttributes: [
            "product_id": product.getId(),
            "product_name": product.getName(),
            "price": product.getPrice(),
            "quantity": product.getQuantity()
        ])

        // Définir les tags utilisateur
        let lastPurchaseDate = Date().timeIntervalSince1970
        let lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice()

        pushwoosh.setTags([
            "last_purchase_date": lastPurchaseDate,
            "lifetime_spend": lifetimeSpend
        ])
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import <PushwooshFramework/PushwooshFramework.h>
#import <PushwooshFramework/PWInAppManager.h>

@implementation Registration

- (void)afterUserLogin:(User *)user {
    NSString *userName = [user getUserName];
    NSDate *lastLogin = [user getLastLoginDate];

    if (userName && lastLogin) {
        [[PWInAppManager sharedManager] postEvent:@"login" withAttributes:@{
            @"name": userName,
            @"last_login": lastLogin
        }];
    }
}

- (void)afterUserPurchase:(User *)user product:(Product *)product {
    Pushwoosh *pushwoosh = [Pushwoosh configure];

    // Suivre l'événement d'achat
    [[PWInAppManager sharedManager] postEvent:@"purchase" withAttributes:@{
        @"product_id": [product getId],
        @"product_name": [product getName],
        @"price": @([product getPrice]),
        @"quantity": @([product getQuantity])
    }];

    // Définir les tags utilisateur
    NSTimeInterval lastPurchaseDate = [[NSDate date] timeIntervalSince1970];
    double lifetimeSpend = /* récupérer les dépenses totales actuelles */ + [product getPrice];

    NSDictionary *tags = @{
        @"last_purchase_date": @(lastPurchaseDate),
        @"lifetime_spend": @(lifetimeSpend)
    };

    [pushwoosh setTags:tags];
}

@end
```
</TabItem>
</Tabs>

### Rich Media

Le Rich Media fait référence à du contenu interactif et multimédia, tel que des images, des vidéos ou du HTML, utilisé dans les notifications et les messages in-app pour améliorer l'engagement des utilisateurs.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshFramework

class ViewController: UIViewController, PWRichMediaPresentingDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        let richMediaConfiguration = PWModalWindowConfiguration.shared()

        PWRichMediaManager.shared().delegate = self
        richMediaConfiguration.configureModalWindow(with: .PWModalWindowPositionBottom,
                                                             present: .PWAnimationPresentFromBottom,
                                                             dismiss: .PWAnimationDismissDown)
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager!, shouldPresent richMedia: PWRichMedia!) -> Bool {
        print("Rich media will be presented with: \(richMedia.pushPayload!)")
        return true
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager!, didPresent richMedia: PWRichMedia!) {
        print("Rich media has been presented with: \(richMedia.pushPayload!)")
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager!, didClose richMedia: PWRichMedia!) {
        print("Rich media has been closed with: \(richMedia.pushPayload!)")
    }

    func richMediaManager(_ richMediaManager: PWRichMediaManager!, presentingDidFailFor richMedia: PWRichMedia!, withError error: (any Error)!) {
        print("Failed to present rich media with: \(richMedia.pushPayload!). Error: \(error.localizedDescription)")
    }
}
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
#import "ViewController.h"
#import <PushwooshFramework/PushwooshFramework.h>
#import <PushwooshFramework/PWRichMediaManager.h>
#import <PushwooshFramework/PWModalWindowConfiguration.h>

@interface ViewController () <PWRichMediaPresentingDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[PWRichMediaManager sharedManager] setDelegate:self];
    [[PWModalWindowConfiguration shared] configureModalWindowWith:PWModalWindowPositionBottom
                                                 presentAnimation:PWAnimationPresentFromBottom
                                                 dismissAnimation:PWAnimationDismissDown];
}

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    NSLog(@"Rich media will be presented with: %@", richMedia.pushPayload);
    return YES;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
    NSLog(@"Rich media has been presented with: %@", richMedia.pushPayload);
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    NSLog(@"Rich media has been closed with:: %@", richMedia.pushPayload);
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
    NSLog(@"Failed to present rich media with: %@. Error: %@", richMedia.pushPayload, error.localizedDescription);
}

@end
```
</TabItem>
</Tabs>




## Dépannage

### Échec de la compilation du module 'PushwooshFramework'

Lors de la compilation de votre projet, vous pouvez rencontrer une erreur similaire à :

```
Failed to build module 'PushwooshFramework'; this SDK is not supported by the compiler
(the SDK is built with 'Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)',
while this compiler is 'Apple Swift version 6.1.2 effective-5.10 (swiftlang-6.1.2.1.2 clang-1700.0.13.5)')
```

**Cause :** Cette erreur n'est pas liée à une incompatibilité de version du compilateur Swift. À partir de la version 6.8.0 du SDK iOS de Pushwoosh, le SDK est modularisé en plusieurs composants qui interagissent les uns avec les autres. L'erreur se produit lorsque tous les frameworks requis ne sont pas ajoutés à votre projet.

**Solution :** Assurez-vous que les quatre frameworks requis sont ajoutés à la cible de votre application lors de l'intégration via le Swift Package Manager :

* ```PushwooshFramework```
* ```PushwooshCore```
* ```PushwooshBridge```
* ```PushwooshLiveActivities```

<img src="/ios-spm-1.webp" alt=""/>

Pour vérifier cela dans Xcode :
1. Sélectionnez votre projet dans le navigateur de projet (Project Navigator)
2. Sélectionnez la cible de votre application
3. Allez dans **General** > **Frameworks, Libraries, and Embedded Content**
4. Confirmez que les quatre frameworks sont listés

---

Si vous rencontrez des problèmes lors du processus d'intégration, veuillez vous référer à la section [support et communauté](/fr/developer/pushwoosh-sdk/support-and-community).