Guide d'intégration de base du SDK iOS
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 iOS de Pushwoosh 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 Swift Package Manager, soit CocoaPods.
Swift Package Manager
Anchor link toDans 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 quatre frameworks suivants à la cible de votre application lors de l’intégration via Swift Package Manager :
PushwooshFramework
PushwooshCore
PushwooshBridge
PushwooshLiveActivities

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'
end
Ensuite, dans le terminal, exécutez la commande suivante pour installer les dépendances :
pod install
2. 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 :
Notifications Push
Modes d'arrière-plan
. Après avoir ajouté cette capacité, cochez la caseNotifications à distance
.
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
Anchor link toAppDelegate
Anchor link toAjoutez le code suivant à votre classe AppDelegate :
import SwiftUIimport PushwooshFramework
@mainstruct MyApp: App { // Enregistrer AppDelegate en tant que 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 pushes Pushwoosh.sharedInstance().delegate = self
// S'enregistrer pour les notifications push Pushwoosh.sharedInstance().registerForPushNotifications()
return true }
// Gérer le jeton reçu d'APNS func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Pushwoosh.sharedInstance().handlePushRegistration(deviceToken) }
// Gérer l'erreur de réception du jeton func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { Pushwoosh.sharedInstance().handlePushRegistrationFailure(error) }
// pour les notifications push silencieuses func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Pushwoosh.sharedInstance().handlePushReceived(userInfo) completionHandler(.noData) }
// Déclenché à la réception d'un push 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 pushes, dans notre cas AppDelegate Pushwoosh.sharedInstance().delegate = self;
// s'enregistrer pour les notifications push Pushwoosh.sharedInstance().registerForPushNotifications()
return true }
// Gérer le jeton reçu d'APNS func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Pushwoosh.sharedInstance().handlePushRegistration(deviceToken) }
// Gérer l'erreur de réception du jeton func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { Pushwoosh.sharedInstance().handlePushRegistrationFailure(error); }
// pour les notifications push silencieuses func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Pushwoosh.sharedInstance().handlePushReceived(userInfo) completionHandler(.noData) }
// cet événement est déclenché à la réception du push 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 pushes, dans notre cas AppDelegate [Pushwoosh sharedInstance].delegate = self;
// s'enregistrer pour les notifications push ! [[Pushwoosh sharedInstance] registerForPushNotifications];
return YES;}
// Gérer le jeton reçu d'APNS- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[Pushwoosh sharedInstance] handlePushRegistration:deviceToken];}
// Gérer l'erreur de réception du jeton- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { [[Pushwoosh sharedInstance] handlePushRegistrationFailure:error];}
// pour les notifications push silencieuses- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [[Pushwoosh sharedInstance] handlePushReceived:userInfo]; completionHandler(UIBackgroundFetchResultNoData);}
// cet événement est déclenché à la réception du push- (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
Info.plist
Anchor link toDans 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
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.
- Saisissez 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'
end
Exécutez la commande suivante dans le terminal pour mettre à jour les dépendances :
pod update
Ajouter 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]; //*********************}
@end
Info.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 Control Panel de 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 principales
Notifications push
Anchor link toDans le SDK Pushwoosh, il existe deux callbacks conçus pour la gestion des 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 la notification (l’ouvre).
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.sharedInstance().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 sharedInstance] 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
Configuration de l’utilisateur
Anchor link toEn se concentrant sur le comportement et les préférences de chaque utilisateur, vous pouvez fournir un contenu personnalisé, ce qui améliore la satisfaction et la fidélité de l’utilisateur.
import PushwooshFramework
class Registration {
func afterUserLogin(user: User) { let pushwoosh = Pushwoosh.sharedInstance() // définir l'ID de l'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 des informations utilisateur supplémentaires en tant que 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 sharedInstance];
// définir l'ID de l'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 en tant que 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
Tags
Anchor link toLes tags sont des paires clé-valeur assigné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 rend possible la messagerie ciblée.
import PushwooshFramework
class UpdateUser { func afterUserUpdateProfile(user: User) { let pushwoosh = Pushwoosh.sharedInstance()
// 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 sharedInstance];
// 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.sharedInstance()
// 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 de l'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 sharedInstance];
// 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 de l'utilisateur NSTimeInterval lastPurchaseDate = [[NSDate date] timeIntervalSince1970]; double lifetimeSpend = /* récupérer le total des dépenses à vie */ + [product getPrice];
NSDictionary *tags = @{ @"last_purchase_date": @(lastPurchaseDate), @"lifetime_spend": @(lifetimeSpend) };
[pushwoosh setTags:tags];}
@end
Rich 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);}
@end
Dépannage
Anchor link toSi vous rencontrez des problèmes pendant le processus d’intégration, veuillez vous référer à la section support et communauté.