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
Anchor link toPour intégrer le SDK Pushwoosh iOS dans votre application, vous aurez besoin des éléments suivants :
Étapes d’intégration
Anchor link to1. Installation
Anchor link toVous pouvez intégrer le SDK Pushwoosh dans votre application en utilisant soit le Swift Package Manager, soit CocoaPods.
Swift Package Manager
Anchor link toDans la section Package Dependencies, ajoutez le paquet suivant :
https://github.com/Pushwoosh/Pushwoosh-XCFrameworkPour utiliser le SDK Pushwoosh iOS, assurez-vous d’ajouter les quatre frameworks suivants à la cible de votre application lors de l’intégration via le Swift Package Manager :
PushwooshFrameworkPushwooshCorePushwooshBridgePushwooshLiveActivities

CocoaPods
Anchor link toOuvrez votre Podfile et ajoutez la dépendance :
# Décommentez la ligne suivante pour définir une plateforme globale pour votre projet# platform :ios, '9.0'
target 'MyApp' do # Commentez la ligne suivante si vous ne voulez pas utiliser de frameworks dynamiques use_frameworks!
pod 'PushwooshXCFramework'
endEnsuite, dans le terminal, exécutez la commande suivante pour installer les dépendances :
pod install2. Capacités
Anchor link toPour activer les notifications push dans votre projet, vous devez ajouter certaines capacités.
Dans la section Signing & Capabilities, ajoutez les capacités suivantes :
Push NotificationsBackground Modes. Après avoir ajouté cette capacité, cochez la caseRemote notifications.
Si vous prévoyez d’utiliser les Time Sensitive Notifications (iOS 15+), ajoutez également la capacité Time Sensitive Notifications.
3. Code d’initialisation
Anchor link toAppDelegate
Anchor link toAjoutez le code suivant à votre classe AppDelegate :
import SwiftUIimport PushwooshFramework
@mainstruct 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 token reçu d'APNS func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Pushwoosh.configure.handlePushRegistration(deviceToken) }
// Gérer l'erreur de réception du token 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() }}import PushwooshFramework
@UIApplicationMainclass 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 token reçu d'APNS func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Pushwoosh.configure.handlePushRegistration(deviceToken) }
// gérer l'erreur de réception du token 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) }}#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 token reçu d'APNS- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[Pushwoosh configure] handlePushRegistration:deviceToken];}
// gérer l'erreur de réception du token- (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);}
@endInfo.plist
Anchor link toDans votre Info.plist :
- définissez la clé
Pushwoosh_APPIDsur le code d’application Pushwoosh. - définissez la clé
Pushwoosh_API_TOKENsur le jeton d’API de l’appareil Pushwoosh
4. Suivi de la livraison des messages
Anchor link toPushwoosh 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
Anchor link to- Dans Xcode, sélectionnez File > New > Target…
- Choisissez Notification Service Extension et appuyez sur Next.
- Entrez le nom de la cible et appuyez sur Finish.
- Lorsque l’activation vous est demandée, appuyez sur Cancel.
Dépendances pour l’extension de service de notification (CocoaPods uniquement)
Anchor link toRemarque : 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 :
# Décommentez la ligne suivante pour définir une plateforme globale pour votre projet# platform :ios, '9.0'
target 'MyApp' do # Commentez la ligne suivante si vous ne voulez pas utiliser de frameworks dynamiques use_frameworks!
pod 'PushwooshXCFramework'
end
target 'MyAppNotificationExtension' do use_frameworks!
pod 'PushwooshXCFramework'
endExécutez la commande suivante dans le terminal pour mettre à jour les dépendances :
pod updateAjouter le SDK Pushwoosh à l’extension de service de notification
Anchor link toCe code vous permet d’intercepter et de traiter les notifications au sein de votre extension de notification.
import UserNotificationsimport PushwooshFramework
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { // Pushwoosh ********** PWNotificationExtensionManager.shared().handle(request, contentHandler: contentHandler) // ********************
self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent { // Modifiez le contenu de la notification ici... contentHandler(bestAttemptContent) } }
override func serviceExtensionTimeWillExpire() { // Appelé juste avant que l'extension ne soit terminée par le système. // Utilisez ceci comme une opportunité de livrer votre "meilleure tentative" de contenu modifié, sinon la charge utile du push d'origine sera utilisée. if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { contentHandler(bestAttemptContent) } }
}#import "PWNotificationExtensionManager.h"
@interface NotificationService : UNNotificationServiceExtension
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { // Pushwoosh ********** [[PWNotificationExtensionManager sharedManager] handleNotificationRequest:request contentHandler:contentHandler]; //*********************}
@endInfo.plist
Anchor link toDans le fichier Info.plist de votre extension de service de notification, ajoutez :
Pushwoosh_APPID- Votre code d’application.
5. Exécuter le projet
Anchor link to- Compilez et exécutez le projet.
- Allez dans le panneau de contrôle Pushwoosh et envoyez une notification push.
- Vous devriez voir la notification dans l’application.
Intégration iOS étendue de Pushwoosh
Anchor link toÀ 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
Anchor link toDans le SDK Pushwoosh, il existe deux 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 callbacks 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
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)") } }}#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); }}@endConfiguration de l’utilisateur
Anchor link toEn 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
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 ]) } }}#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]; }}
@endTags
Anchor link toLes 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 un message ciblé.
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() ]) }}#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Événements
Anchor link toLes é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
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 ]) }}#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];}
@endRich Media
Anchor link toLe 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 de l’utilisateur
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)") }}#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);}
@endDépannage
Anchor link toÉchec de la compilation du module ‘PushwooshFramework’
Anchor link toLors 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 Pushwoosh iOS, 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 :
PushwooshFrameworkPushwooshCorePushwooshBridgePushwooshLiveActivities

Pour vérifier cela dans Xcode :
- Sélectionnez votre projet dans le navigateur de projet (Project Navigator)
- Sélectionnez la cible de votre application
- Allez dans General > Frameworks, Libraries, and Embedded Content
- Confirmez que les quatre frameworks sont listés
Si vous rencontrez des problèmes pendant le processus d’intégration, veuillez vous référer à la section support et communauté.