Abonnements aux événements
Découvrez comment fonctionnent les abonnements aux événements du SDK Braze pour les Banners, Content Cards et Feature Flags. Cet article explique quand chaque événement se déclenche et ce que votre intégration doit faire en conséquence.
Prérequis
Voici les versions minimales du SDK nécessaires pour utiliser les abonnements aux événements :
À propos des abonnements aux événements
Chaque canal dispose d’une méthode d’abonnement aux événements. Vous enregistrez un rappel, et le SDK l’appelle chaque fois que quelque chose se produit sur ce canal, comme une relecture du cache, une actualisation terminée, un événement analytique ou une erreur. Chaque événement vous indique le type d’événement reçu.
Les méthodes d’abonnement aux événements remplacent les anciennes méthodes d’abonnement aux mises à jour. Les anciennes méthodes ne fournissent que les données actuelles. Les méthodes d’événement vous indiquent également pourquoi les données ont changé, quand des événements analytiques sont enregistrés et envoyés, et quand une requête échoue.
| Canal | Méthode d’abonnement aux événements | Remplace | Guide |
|---|---|---|---|
| Banners | subscribeToBannersEvents |
subscribeToBannersUpdates |
Gérer les emplacements Banner |
| Content Cards | subscribeToContentCardsEvents |
subscribeToContentCardsUpdates |
Créer des Content Cards |
| Feature Flags | subscribeToFeatureFlagsEvents |
subscribeToFeatureFlagsUpdates |
Créer des feature flags |

subscribeToBannersUpdates, subscribeToContentCardsUpdates et subscribeToFeatureFlagsUpdates sont dépréciées et seront supprimées dans une future version majeure. Utilisez la méthode d’abonnement aux événements correspondante à la place.
| Canal | Méthode d’abonnement aux événements | Remplace | Guide |
|---|---|---|---|
| Banners | braze.banners.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Gérer les emplacements Banner |
| Content Cards | braze.contentCards.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Créer des Content Cards |
| Feature Flags | braze.featureFlags.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Créer des feature flags |
Pour la référence API complète, consultez la documentation BrazeKit.
Chaque canal dispose également d’une propriété eventsStream qui fournit les mêmes événements sous forme d’AsyncStream. Les applications Objective-C utilisent la méthode subscribeToEvents: sur les mêmes objets de canal.

L’ancienne méthode subscribeToUpdates(_:) et les flux de mise à jour par canal, tels que bannersStream, sont dépréciés. Utilisez subscribeToEvents(_:) ou eventsStream à la place.
| Canal | Méthode d’abonnement aux événements | Classe d’événement | Remplace | Guide |
|---|---|---|---|---|
| Banners | subscribeToBannersEvents |
BannersEvent |
subscribeToBannersUpdates |
Gérer les emplacements Banner |
| Content Cards | subscribeToContentCardsEvents |
ContentCardsEvent |
subscribeToContentCardsUpdates |
Créer des Content Cards |
| Feature Flags | subscribeToFeatureFlagsEvents |
FeatureFlagsEvent |
subscribeToFeatureFlagsUpdates |
Créer des feature flags |
Pour la référence API complète, consultez la documentation KDoc du SDK Android Braze.

subscribeToBannersUpdates, subscribeToContentCardsUpdates, subscribeToFeatureFlagsUpdates et subscribeToBannersErrors sont dépréciées. Utilisez la méthode d’abonnement aux événements correspondante à la place.
Noms par plateforme
Cet article utilise les noms Web pour les types d’événements, les raisons de mise à jour, les états de nouvelle tentative, les actions analytiques et les raisons d’erreur. Swift et Android utilisent les mêmes concepts avec des noms qui suivent les conventions de chaque plateforme.
| Web | Swift | Android |
|---|---|---|
CACHE_REPLAY |
cacheReplay |
CacheReplay |
CACHE_LOAD |
cacheLoad |
CacheLoad |
DATA_UPDATED |
dataUpdated |
DataUpdated |
IMPRESSION |
impressionEvent |
ImpressionEvent |
CLICK |
clickEvent |
ClickEvent |
DISMISS |
dismissEvent |
DismissEvent |
ERROR |
error |
ErrorEvent |
AUTO_SERVER_REFRESH |
autoServerRefresh |
AUTO_SERVER_REFRESH |
SDK_WILL_RETRY |
sdkWillRetry |
SDK_WILL_RETRY |
ENQUEUED |
enqueued |
ENQUEUED |
SERVER_ERROR |
.common(.serverError) |
Common(ErrorReason.ServerError) |
FEATURE_DISABLED |
.featureDisabled |
FeatureDisabled |
Les autres raisons de mise à jour, états de nouvelle tentative, actions analytiques et raisons d’erreur suivent le même schéma. Sur Swift, le type de raison de mise à jour est Braze.ChannelUpdateReason. Sur Android, chaque canal possède son propre type de raison de mise à jour, comme BannersUpdateReason.
Comment les événements sont délivrés
Le SDK délivre les événements dans cet ordre :
- Lorsque vous vous abonnez : le SDK appelle votre rappel immédiatement avec un événement
CACHE_REPLAYcontenant les données en cache. Si le canal est désactivé, il envoie à la place un événementERRORavec la raisonFEATURE_DISABLED. Dans les deux cas, votre abonnement reste actif. - Lorsque le cache change : le SDK envoie un événement
CACHE_LOADsi le cache a changé sans actualisation serveur, ou un événementDATA_UPDATEDsi une actualisation est terminée ou si vous avez modifié les données localement. - Lorsque vous ou le SDK enregistrez des données analytiques : le SDK envoie un événement
IMPRESSION,CLICKouDISMISSavec l’actionENQUEUED, puis le renvoie avec l’actionFLUSHEDaprès que Braze l’a accepté. - Lorsqu’un problème survient : le SDK envoie un événement
ERROR.
Votre rappel reçoit l’événement comme seul argument. Gérez chaque type d’événement avec un switch sur le type d’événement. Sur Web, le SDK consigne les erreurs que votre rappel lance et continue de délivrer l’événement aux autres abonnés.
import * as braze from "@braze/web-sdk";
// Register the subscription
const subscriptionId = braze.subscribeToBannersEvents((event) => {
switch (event.type) {
case braze.ChannelEventType.CACHE_REPLAY:
// Sent once, right away, with the cached data
break;
case braze.ChannelEventType.DATA_UPDATED:
// A refresh finished or the data changed locally
break;
case braze.ChannelEventType.ERROR:
// A request or analytics operation failed
break;
}
});
// Remove the subscription when you no longer need it
braze.removeSubscription(subscriptionId);

Appelez la méthode d’abonnement aux événements après avoir initialisé le SDK. Appelez-la avant openSession() pour que votre rappel reçoive les événements de la première session. Si le SDK est désactivé, la méthode renvoie undefined.
// Register the subscription and keep a strong reference to it
let cancellable = AppDelegate.braze?.banners.subscribeToEvents { event in
switch event {
case .cacheReplay(let cacheSnapshot):
// Sent once, right away, with the cached data
break
case .dataUpdated(let cacheSnapshot, let reason):
// A refresh finished or the data changed locally
break
case .error(let reason, let retryState):
// A request or analytics operation failed
break
default:
break
}
}
// Remove the subscription when you no longer need it
cancellable?.cancel()

Conservez une référence forte vers l’objet cancellable retourné. Le SDK annule l’abonnement lorsque le cancellable est libéré. Le SDK appelle votre gestionnaire sur le thread principal.
// Register the subscription
val subscriber = IEventSubscriber<BannersEvent> { event ->
when (event) {
is BannersEvent.CacheReplay -> {
// Sent once, right away, with the cached data
}
is BannersEvent.DataUpdated -> {
// A refresh finished or the data changed locally
}
is BannersEvent.ErrorEvent -> {
// A request or analytics operation failed
}
else -> Unit
}
}
Braze.getInstance(context).subscribeToBannersEvents(subscriber)
// Remove the subscription when you no longer need it
Braze.getInstance(context).removeSingleSubscription(subscriber, BannersEvent::class.java)

Le SDK appelle votre abonné depuis un thread en arrière-plan. Basculez sur le thread principal avant de mettre à jour votre interface utilisateur.
Instantanés du cache
Les événements CACHE_REPLAY, CACHE_LOAD et DATA_UPDATED incluent une propriété cacheSnapshot contenant les données que le SDK a mises en cache pour l’utilisateur actuel.
| Canal | Données dans cacheSnapshot |
|---|---|
| Banners | banners : un dictionnaire associant chaque ID d’emplacement à son Banner en cache. Les emplacements sans Banner ne figurent pas dans le dictionnaire. |
| Content Cards | Web : contentCards, un objet ContentCards. Utilisez contentCards.cards pour obtenir la liste des cards. Swift et Android : cards, la liste des cards. |
| Feature Flags | featureFlags : la liste des feature flags. |
Chaque instantané inclut également lastSyncAt, l’horodatage de la dernière synchronisation réussie pour l’utilisateur actuel, exprimé en timestamp Unix en secondes. La valeur est 0 si aucune synchronisation n’a réussi et null (nil sur Swift) si le canal est désactivé.
Migrer depuis les abonnements aux mises à jour
Les méthodes d’abonnement aux mises à jour fonctionnent toujours, mais elles sont dépréciées. Pour migrer chaque abonnement, après avoir rempli les prérequis :
- Remplacez la méthode dépréciée par la méthode d’abonnement aux événements correspondante. Les tableaux dans À propos des abonnements aux événements listent chaque paire.
- Mettez à jour votre rappel. L’ancien rappel ne recevait que les données actuelles. Le nouveau rappel reçoit un événement, vérifiez donc le type d’événement. Pour les événements
CACHE_REPLAY,CACHE_LOADetDATA_UPDATED, lisez les données depuiscacheSnapshotet effectuez un nouveau rendu. - (Facultatif) Gérez les événements
ERRORpour savoir quand une actualisation ou une opération analytique échoue. Sur Android, ils remplacentsubscribeToBannersErrors. Pour plus de détails, consultez Raisons d’erreur. - Supprimez l’abonnement. Sur Android, passez la nouvelle classe d’événement (
BannersEvent,ContentCardsEventouFeatureFlagsEvent) àremoveSingleSubscription, et non l’ancienne classe…UpdatedEvent.
Pour consulter le code avant/après, reportez-vous au guide de chaque canal dans les tableaux de la section À propos des abonnements aux événements.
Types d’événements
Chaque événement correspond à l’un des types d’événements de ce tableau. Sur Web, l’événement possède une propriété type avec l’une des valeurs ChannelEventType. Sur Swift et Android, chaque type d’événement est son propre case ou classe. Tous les canaux n’envoient pas tous les types d’événements.
| Type d’événement | Envoyé par | Quand il se déclenche | Que faire |
|---|---|---|---|
CACHE_REPLAY |
Banners, Content Cards, Feature Flags | Une fois, immédiatement, chaque fois que vous vous abonnez. Il contient un cacheSnapshot avec le cache actuel. |
Affichez les données en cache pour que votre interface ait du contenu sans attendre le réseau. |
CACHE_LOAD |
Banners, Content Cards, Feature Flags | Le cache a changé sans actualisation serveur. Cela se produit lors d’un changement d’utilisateur, lorsque vous effacez les données du SDK ou lorsque le canal est désactivé. Sur Web, Content Cards l’envoie également lorsque des cards arrivent du service de traitement. Sur Swift et Android, il se déclenche aussi lorsque le SDK charge le cache depuis le stockage local avant toute synchronisation réseau. Il contient un cacheSnapshot avec le nouveau cache. |
Effectuez un nouveau rendu à partir de l’instantané. Après un changement d’utilisateur ou lorsque le canal est désactivé, l’instantané peut être vide : effacez donc le contenu de l’utilisateur précédent. |
DATA_UPDATED |
Banners, Content Cards, Feature Flags | Le cache a changé. Le SDK l’envoie pour chaque actualisation terminée, même si rien n’a changé, et pour les modifications locales comme un rejet. Il contient un cacheSnapshot et une reason. |
Effectuez un nouveau rendu à partir de l’instantané. Vérifiez reason pour déterminer si le changement provient d’une actualisation ou de votre propre action. |
IMPRESSION |
Banners, Content Cards, Feature Flags | Une impression a été enregistrée. Il contient une action et l’élément enregistré (banner, card ou flag). |
Facultatif. Utilisez-le pour refléter les impressions dans vos propres outils analytiques. |
CLICK |
Banners, Content Cards | Un clic a été enregistré. Il contient une action et l’élément cliqué (banner ou card). Les clics de Banner incluent également un ID de bouton si le clic provient d’un bouton avec un ID. |
Facultatif. Utilisez-le pour refléter les clics dans vos propres outils analytiques. |
DISMISS |
Banners, Content Cards | Un rejet a été enregistré. Il contient une action et l’élément rejeté (banner ou card). |
Facultatif. DISMISS est l’événement analytique, mettez donc à jour votre interface à partir de l’événement DATA_UPDATED qui suit un rejet. |
ERROR |
Banners, Content Cards, Feature Flags | Une requête ou une opération a échoué. Il contient une reason et un retryState. Sur Web, il contient parfois rateLimitedUntil. Sur Swift et Android, le délai de limitation de débit fait partie de la raison RATE_LIMITED. |
Vérifiez retryState pour décider de retenter ou non, et vérifiez reason pour en trouver la cause. |
Raisons de mise à jour
Les événements DATA_UPDATED incluent une reason avec l’une des valeurs ChannelUpdateReason.
| Valeur | Signification | Que faire |
|---|---|---|
AUTO_SERVER_REFRESH |
Une actualisation initiée par le SDK est terminée, comme une actualisation lors d’une nouvelle session, y compris ses nouvelles tentatives. | Effectuez un nouveau rendu à partir de l’instantané. |
MANUAL_SERVER_REFRESH |
Une actualisation que vous avez demandée est terminée, y compris ses nouvelles tentatives. Par exemple requestBannersRefresh(), requestContentCardsRefresh() et refreshFeatureFlags() sur Web et Android, ou requestRefresh() sur Swift. |
Effectuez un nouveau rendu à partir de l’instantané. Utilisez cette raison pour masquer un indicateur de chargement que vous avez affiché lors de la demande d’actualisation. |
CLIENT_ACTION |
Le cache a changé à la suite d’une action locale au lieu d’une réponse serveur, comme le rejet d’un Banner ou d’une Content Card. | Effectuez un nouveau rendu à partir de l’instantané sans afficher d’état de chargement ou d’erreur. Feature Flags n’envoie pas actuellement cette raison, mais gérez-la pour que votre code continue de fonctionner si elle est ajoutée. |
États de nouvelle tentative
Les événements ERROR incluent un retryState avec l’une des valeurs RetryState. Il vous indique si le SDK retentera l’opération échouée et ce que vous devez faire.
| Valeur | Signification | Que faire |
|---|---|---|
SDK_WILL_RETRY |
Le SDK retente automatiquement, ou attend que la limitation de débit soit levée avant de retenter. | Continuez à afficher le contenu en cache. Ne demandez pas une autre actualisation, car le SDK envoie un événement DATA_UPDATED ou un autre événement ERROR lorsque la nouvelle tentative est terminée. |
INTEGRATOR_MAY_RETRY |
Le SDK a cessé de retenter. | Continuez à afficher le contenu en cache. Vous pouvez rappeler la méthode d’actualisation après un délai. Si l’événement inclut rateLimitedUntil, attendez ce moment. |
DO_NOT_RETRY |
L’échec est définitif pour cette opération. Retenter ne servira à rien. | Ne retentez pas. Corrigez plutôt la cause, comme la clé API ou les paramètres du workspace. Si la raison est FEATURE_DISABLED, arrêtez d’afficher le contenu du canal. |

Les actualisations ne sont pas retentées automatiquement après une erreur client (une réponse HTTP 4xx autre que 429). Le SDK signale ces erreurs avec l’état de nouvelle tentative DO_NOT_RETRY. Il retente tout de même les réponses HTTP 429, HTTP 5xx et les défaillances réseau.
Actions analytiques
Les événements IMPRESSION, CLICK et DISMISS incluent une action avec l’une des valeurs AnalyticsAction. Chaque événement analytique est envoyé deux fois : d’abord avec ENQUEUED, puis avec FLUSHED.
| Valeur | Signification | Que faire |
|---|---|---|
ENQUEUED |
Le SDK a enregistré l’événement analytique localement. Braze ne l’a pas encore reçu. | Utilisez-le pour mettre à jour votre interface ou votre propre journalisation immédiatement. |
FLUSHED |
Le SDK a transmis l’événement analytique à Braze avec une réponse réseau réussie. | Utilisez-le comme confirmation que l’événement a été transmis. |
Raisons d’erreur
Les événements ERROR incluent une reason avec l’une des valeurs ChannelErrorReason. Chaque raison peut s’appliquer à tous les canaux.
| Valeur | Signification | Que faire |
|---|---|---|
SERVER_ERROR |
Braze a renvoyé une erreur côté serveur (comme une réponse HTTP 5xx, ou une réponse HTTP 429 sans en-tête Retry-After exploitable), ou la requête n’a pas atteint Braze. |
Suivez le retryState. Le SDK retente d’abord, puis signale INTEGRATOR_MAY_RETRY. Continuez à afficher le contenu en cache. |
CLIENT_ERROR |
Braze a rejeté la requête (comme une réponse HTTP 4xx autre que 429, ou une erreur d’authentification SDK). Sur Web, pour Feature Flags, cela peut aussi signifier que le SDK n’a pas pu enregistrer une impression localement. | Suivez le retryState. Une réponse HTTP 4xx est directement DO_NOT_RETRY. Pour une erreur d’authentification SDK, le SDK retente d’abord puis signale DO_NOT_RETRY. Vérifiez votre clé API, votre endpoint SDK et la configuration de l’authentification SDK. |
RATE_LIMITED |
La requête a été limitée en débit. L’événement inclut rateLimitedUntil, une date indiquant le moment le plus proche auquel une nouvelle tentative peut réussir. |
Si le retryState est SDK_WILL_RETRY, attendez. S’il est INTEGRATOR_MAY_RETRY, attendez jusqu’à rateLimitedUntil avant d’actualiser à nouveau, car une requête antérieure échouera de nouveau. Pour plus d’informations, consultez Limites de débit. |
SDK_DISABLED |
Le SDK est désactivé localement, il n’effectue donc aucune requête réseau. | Traitez cela comme définitif et ne retentez pas. |
INVALID_SERVER_DATA |
Braze a renvoyé des données que le SDK n’a pas pu interpréter. | Ne retentez pas. Le retryState est DO_NOT_RETRY. Continuez à afficher le contenu en cache et contactez le support Braze si le problème persiste. |
FEATURE_DISABLED |
Le canal est désactivé pour ce workspace. Le SDK signale également le canal comme désactivé jusqu’à ce qu’il reçoive sa première configuration de Braze. | Masquez l’interface du canal. Ce n’est pas la même chose qu’une liste de contenu vide. Conservez votre abonnement : si Braze active ensuite le canal, le SDK actualise et envoie un événement DATA_UPDATED. |

Vous pouvez recevoir une erreur FEATURE_DISABLED lorsque vous vous abonnez avant que le SDK ait reçu sa première configuration de Braze, même si le canal est activé pour votre workspace. Gardez votre abonnement actif et gérez l’événement DATA_UPDATED qui suit.