Passer au contenu

Configuration de Pushwoosh InboxKit pour iOS

Disponible depuis le SDK iOS 7.0.40.

Pushwoosh InboxKit fournit un écran de boîte de réception UIKit moderne qui s’appuie sur le backend de boîte de réception existant. Trois mises en page de cellules par défaut couvrent les formes courantes de cartes de contenu de style Braze, les boutons CTA en ligne gèrent les interactions les plus fréquentes, et toute la surface est ouverte à la sous-classification si vous avez besoin d’une apparence personnalisée.

Flux InboxKit montrant des cartes bannière, avec légende et classiques avec des boutons en ligne et des indicateurs de non-lecture

Flux InboxKit par défaut avec des cartes bannière, avec légende et classiques.

Quand utiliser InboxKit

Anchor link to

Utilisez InboxKit pour toute nouvelle intégration iOS. C’est le remplacement recommandé pour l’ancien module Objective-C PushwooshInboxUI.

InboxKit vous offre :

  • Trois types de cellules intégrés — bannière, avec légende, classique — sélectionnés par message via actionParams["displayType"] depuis votre charge utile de push, ou forcés depuis le code via attributes.forceCellKind.
  • Des boutons CTA en ligne avec une énumération typée PushwooshInboxButtonAction (openURL, dismiss, markRead, custom). Le SDK gère les trois premiers automatiquement ; votre délégué achemine custom vers votre propre logique.
  • Prise en charge de l’épinglage : les messages avec actionParams["pinned"] == true remontent en haut du flux et affichent un glyphe d’épingle.
  • Balayage pour supprimer, tirer pour rafraîchir, marquage automatique comme lu à la disparition — tous activables via PushwooshInboxKitAttributes.
  • Stockage persistant : les suppressions et l’état de lecture survivent à un redémarrage du processus même si l’appel réseau n’a pas encore été acquitté.
  • Une classe de base ouverte PushwooshInboxCell pour des mises en page entièrement personnalisées.

Le contrat serveur reste inchangé — le même backend de boîte de réception Pushwoosh, les mêmes charges utiles et les mêmes outils de tableau de bord fonctionnent comme avant.

Choisissez votre méthode d’intégration

Anchor link to

Lire les données personnalisées d’un message

Anchor link to

Pour qu’un push apparaisse dans la boîte de réception, la requête createMessage de l’API Messages doit inclure inbox_image, inbox_date ou inbox_days — sans l’un de ces champs, le push est livré comme une notification normale et n’atteint jamais le flux de la boîte de réception. Les données personnalisées de forme libre vont sous la clé data, que le SDK livre au client en tant que paramètre u :

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"request": {
"application": "XXXXX-XXXXX",
"auth": "API_TOKEN",
"notifications": [{
"send_date": "now",
"ios_title": "Summer sale",
"content": "30% off everything — limited time only",
"inbox_image": "https://cdn.example.com/inbox/summer.png",
"inbox_days": 7,
"data": {
"promo_id": "SUMMER2026",
"screen": "promo_details"
},
"ios_root_params": {
"displayType": "captioned"
},
"platforms": [1]
}]
}
}

Le SDK expose cet objet sur le message de la boîte de réception via actionParams. Lisez-le depuis le délégué lorsque l’utilisateur appuie sur la ligne ou sur un CTA en ligne :

extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController,
didSelect message: PWInboxMessageProtocol) -> Bool {
guard let params = message.actionParams as? [String: Any] else { return true }
// The custom `data` object arrives under the "u" key —
// either as a nested dictionary or as a JSON-encoded string,
// depending on how the payload was built upstream.
let custom: [String: Any]? = {
if let dict = params["u"] as? [String: Any] { return dict }
if let raw = params["u"] as? String,
let bytes = raw.data(using: .utf8),
let parsed = try? JSONSerialization.jsonObject(with: bytes) as? [String: Any] {
return parsed
}
return nil
}()
if let promoId = custom?["promo_id"] as? String {
navigateToPromo(promoId)
return false // we handled the tap; SDK should not run the default action
}
return true
}
}

La même recherche actionParams["u"] fonctionne à l’intérieur de inboxKit(_:didTapButton:onMessage:) pour les boutons CTA en ligne. Pour les cas de CTA typés (openURL, dismiss, markRead), le SDK exécute déjà l’action par défaut — retournez true pour conserver ce comportement, ou false pour le supprimer et exécuter le vôtre.

Ajouter des boutons CTA en ligne

Anchor link to

Un message peut contenir jusqu’à trois boutons d’appel à l’action en ligne. Les boutons se trouvent à côté d’autres données personnalisées à l’intérieur de data sous la forme d’un tableau buttons. Le SDK les affiche automatiquement dans les cellules avec légende et classiques :

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"request": {
"application": "XXXXX-XXXXX",
"auth": "API_TOKEN",
"notifications": [{
"send_date": "now",
"ios_title": "New promo card",
"content": "Tap a button to claim or save",
"inbox_image": "https://cdn.example.com/inbox/promo.png",
"inbox_days": 7,
"data": {
"promo_id": "SUMMER2026",
"buttons": [
{ "title": "Claim", "url": "https://example.com/promo/SUMMER2026" },
{ "title": "Read", "action": "markRead" },
{ "title": "Save", "action": "custom", "tag": "save_promo" }
]
},
"ios_root_params": { "displayType": "captioned" },
"platforms": [1]
}]
}
}

Chaque objet bouton a ces champs :

ChampTypeQuand
titlechaîneRequis. Étiquette visible du bouton.
urlchaîneUne URL non vide et analysable produit une action openURL. Le SDK l’ouvre via UIApplication.shared.open à moins que votre délégué ne la supprime.
actionchaîneJeton d’action explicite : dismiss (supprime le message du flux), markRead (marque le message comme lu), ou custom (géré par l’hôte). Insensible à la casse.
Tout autretoutLorsque action est custom, chaque clé de l’objet bouton, à l’exception de title et action, est transmise à votre délégué en tant que charge utile personnalisée — mettez-vous d’accord sur une clé avec le marketeur (par ex. tag) et distribuez en fonction de celle-ci.

Priorité de résolution : d’abord le jeton action explicite, puis url s’il n’est pas vide, sinon le bouton tombe dans custom en transportant la charge utile complète (moins title et action).

Interceptez les appuis depuis votre délégué. La propriété button.action est l’énumération typée PushwooshInboxButtonAction :

extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController,
didTapButton button: PushwooshInboxButton,
onMessage message: PWInboxMessageProtocol) -> Bool {
switch button.action {
case .openURL(let url):
// Default behavior is fine — let SDK open the URL.
return true
case .dismiss, .markRead:
// SDK handles both. Return false if you want to override.
return true
case .custom(let payload):
// Marketer-defined custom button. Dispatch on a key you agreed on.
if let tag = payload["tag"] as? String {
switch tag {
case "save_promo":
saveCurrentPromoLocally(message: message)
default:
break
}
}
return true // ignored for custom — SDK never runs a default action here
}
}
}