Passer au contenu

Gérer les emplacements de bannières

Découvrez comment créer et gérer les emplacements de bannières dans le SDK Braze, notamment comment accéder à leurs propriétés uniques et enregistrer les impressions. Pour plus d’informations générales, consultez À propos des bannières.

À propos des demandes de placement

Lorsque vous créez des emplacements dans votre application ou votre site web, votre application envoie une requête à Braze afin de récupérer les messages Banner pour chaque emplacement.

  • Vous pouvez demander jusqu’à 10 emplacements par requête d’actualisation.
  • Pour chaque emplacement, Braze renvoie le Banner ayant la priorité la plus élevée que l’utilisateur est éligible à recevoir.
  • Si plus de 10 emplacements sont demandés lors d’une actualisation, seuls les 10 premiers sont renvoyés ; les autres sont ignorés.

Par exemple, une application peut demander trois emplacements dans une requête d’actualisation : homepage_promo, cart_abandonment et seasonal_offer. Chaque requête renvoie le Banner le plus pertinent pour cet emplacement.

Limitation du débit pour les requêtes d’actualisation

Si vous utilisez des versions du SDK antérieures (avant Swift 13.1.0, Android 38.0.0, Web 6.1.0, React Native 17.0.0 et Flutter 15.0.0), une seule requête d’actualisation est autorisée par session utilisateur.

Si vous utilisez les versions minimales les plus récentes du SDK (Swift 13.1.0+, Android 38.0.0+, Web 6.1.0+, React Native 17.0.0+ et Flutter 15.0.0+), les requêtes d’actualisation sont contrôlées par un algorithme de type « token bucket » afin d’éviter une interrogation excessive :

  • Chaque session utilisateur commence avec cinq jetons d’actualisation.
  • Les jetons se rechargent à raison d’un jeton toutes les 180 secondes (3 minutes).

Chaque appel explicite à requestBannersRefresh consomme un jeton. L’actualisation automatique qui se produit au début d’une nouvelle session ou lorsque changeUser est appelé ne consomme pas de jeton, car cette actualisation publie le dernier Banner mis en cache pour cet utilisateur. Si vous tentez une actualisation alors qu’aucun jeton n’est disponible, le SDK n’effectue pas la requête et enregistre une erreur jusqu’à ce qu’un jeton soit réapprovisionné. Ceci est important pour les mises à jour en cours de session et les mises à jour déclenchées par des événements. Pour mettre en œuvre des mises à jour dynamiques (par exemple, après qu’un utilisateur a effectué une action sur la même page), appelez la méthode d’actualisation après l’enregistrement de l’événement personnalisé, mais tenez compte du délai nécessaire à Braze pour ingérer et traiter l’événement avant que l’utilisateur ne soit éligible à une autre Campaign Banner.

Créer un placement

Prérequis

Voici les versions minimales du SDK nécessaires pour créer des placements de Banner :

Étape 1 : Créer des emplacements dans Braze

Si vous ne l’avez pas encore fait, vous devrez créer des emplacements de bannières dans Braze, qui servent à définir les endroits de votre application ou de votre site pouvant afficher des bannières. Pour créer un emplacement, allez dans Paramètres > Placements de bannières, puis sélectionnez Créer un placement.

Section Placements de bannières pour créer des ID d'emplacement.

Donnez un nom à votre emplacement et attribuez-lui un ID de placement. Veillez à consulter les autres équipes avant d’attribuer un ID, car il sera utilisé tout au long du cycle de vie de la carte et ne devrait pas être modifié par la suite. Pour plus d’informations, consultez ID de placement.

Détails de l'emplacement indiquant qu'une bannière s'affichera dans la barre latérale gauche pour les campagnes de promotion des soldes de printemps.

Étape 2 : Actualiser les placements dans votre application

Pour actualiser les placements, appelez requestBannersRefresh() pour votre SDK.

requestBannersRefresh() fusionne les données dans le cache de Banner existant. Seuls les ID de placement que vous transmettez sont ajoutés, mis à jour ou supprimés :

  • Si le serveur renvoie un Banner pour un placement demandé, le Banner mis en cache pour ce placement est remplacé.
  • Si le serveur ne renvoie aucun Banner pour un placement demandé, ce placement est supprimé du cache.
  • Les Banners mis en cache pour des placements que vous n’avez pas demandés restent dans le cache jusqu’à leur expiration.

Pour connaître le nombre de placements que vous pouvez demander par actualisation, consultez À propos des requêtes de placement. Vous pouvez actualiser différents ensembles de placements au fil du temps (par exemple, les placements sur l’écran actuel) et conserver les Banners pour d’autres placements dans le cache.

Le comportement d’actualisation des Banners suit deux chemins :

  1. Actualisation explicite : Vous pouvez appeler la méthode d’actualisation à tout moment durant une session active.
  2. Actualisation automatique lors d’une nouvelle session : Après avoir effectué au moins une demande d’actualisation explicite, le SDK peut re-demander les ID de placement les plus récemment demandés lorsqu’une nouvelle session Braze démarre (par exemple, après changeUser() ou après un délai d’expiration de session).

Le rôle de subscribeToBannersUpdates() diffère selon la plateforme :

  • iOS et Android : subscribeToBannersUpdates() (ou subscribeToUpdates() sur Swift) enregistre un rappel de mise à jour. L’actualisation automatique au démarrage de session ne dépend pas de l’abonnement actif.
  • Web : L’actualisation automatique au démarrage de session est liée à l’enregistrement de subscribeToBannersUpdates(). Sans abonnement actif, le SDK ne répète pas automatiquement l’actualisation lors d’une nouvelle session.

Dans tous les cas, vous devez effectuer au moins une demande d’actualisation explicite par cycle de vie de l’application afin que le SDK sache quels ID de placement maintenir à jour. Les Banners ne sont pas récupérés automatiquement au premier lancement sans cet appel initial, et les ID de placement suivis sont réinitialisés après le redémarrage de l’application.

Les actualisations automatiques au démarrage de session ne consomment pas de jeton de limitation du débit.

import * as braze from "@braze/web-sdk";

braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);
AppDelegate.braze?.banners.requestBannersRefresh(placementIds: ["global_banner", "navigation_square_banner"])
ArrayList<String> listOfBanners = new ArrayList<>();
listOfBanners.add("global_banner");
listOfBanners.add("navigation_square_banner");
Braze.getInstance(context).requestBannersRefresh(listOfBanners);
Braze.getInstance(context).requestBannersRefresh(listOf("global_banner", "navigation_square_banner"))
Braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);
This feature is not currently supported on Unity.
This feature is not currently supported on Cordova.
braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);
This feature is not currently supported on Roku.

Étape 3 : Écouter les mises à jour

Si vous utilisez du JavaScript natif avec le SDK Web Braze, utilisez subscribeToBannersUpdates pour écouter les mises à jour de placement, puis appelez requestBannersRefresh pour les récupérer.

import * as braze from "@braze/web-sdk";

braze.subscribeToBannersUpdates((banners) => {
  console.log("Banners were updated");
});

// always refresh after your subscriber function has been registered
braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);

Si vous utilisez React avec le SDK Web Braze, configurez subscribeToBannersUpdates dans un hook useEffect et appelez requestBannersRefresh après avoir enregistré votre écouteur.

import * as braze from "@braze/web-sdk";

useEffect(() => {
  const subscriptionId = braze.subscribeToBannersUpdates((banners) => {
    console.log("Banners were updated");
  });

  // always refresh after your subscriber function has been registered
  braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);

  // cleanup listeners
  return () => {
    braze.removeSubscription(subscriptionId);
  }
}, []);
let placementIds = ["global_banner", "navigation_square_banner"]
let cancellable = brazeClient.braze()?.banners.subscribeToUpdates { banners in
  banners.forEach { placementId, banner in
    print("Received banner: \(banner) with placement ID: \(placementId)")
  }
}
// Always refresh after your subscriber is registered
brazeClient.braze()?.banners.requestBannersRefresh(placementIds: placementIds)
ArrayList<String> placementIds = new ArrayList<>();
placementIds.add("global_banner");
placementIds.add("navigation_square_banner");
Braze.getInstance(context).subscribeToBannersUpdates(banners -> {
  for (Banner banner : banners.getBanners()) {
    Log.d(TAG, "Received banner: " + banner.getPlacementId());
  }
});
// Always refresh after your subscriber is registered
Braze.getInstance(context).requestBannersRefresh(placementIds);
val placementIds = listOf("global_banner", "navigation_square_banner")
Braze.getInstance(context).subscribeToBannersUpdates { update ->
  for (banner in update.banners) {
    Log.d(TAG, "Received banner: " + banner.placementId)
  }
}
// Always refresh after your subscriber is registered
Braze.getInstance(context).requestBannersRefresh(placementIds)
const bannerCardsSubscription = Braze.addListener(
  Braze.Events.BANNER_CARDS_UPDATED,
  (data) => {
    const banners = data.banners;
    console.log(
      `Received ${banners.length} Banner Cards with placement IDs:`,
      banners.map((banner) => banner.placementId)
    );
  }
);
This feature is not currently supported on Unity.
This feature is not currently supported on Cordova.
StreamSubscription bannerStreamSubscription = braze.subscribeToBanners((List<BrazeBanner> banners) {
  for (final banner in banners) {
    print("Received banner: " + banner.toString());
  }
});
This feature is not currently supported on Roku.

Étape 4 : Insérer à l’aide de l’ID de placement

Créez un élément conteneur pour le Banner. Veillez à définir sa largeur et sa hauteur.

<div id="global-banner-container" style="width: 100%; height: 450px;"></div>

Si vous utilisez du JavaScript natif avec le SDK Web Braze, appelez la méthode insertBanner pour remplacer le HTML interne de l’élément conteneur.

import * as braze from "@braze/web-sdk";

braze.initialize("sdk-api-key", {
  baseUrl: "sdk-base-url",
  allowUserSuppliedJavascript: true, // banners require you to opt-in to user-supplied javascript
});

braze.subscribeToBannersUpdates((banners) => {
  // get this placement's banner. If it's `null` the user did not qualify for one.
  const globalBanner = braze.getBanner("global_banner");
  if (!globalBanner) {
    return;
  }

  // choose where in the DOM you want to insert the banner HTML
  const container = document.getElementById("global-banner-container");

  // Insert the banner which replaces the innerHTML of that container
  braze.insertBanner(globalBanner, container);

  // Special handling if the user is part of a Control Variant
  if (globalBanner.isControl) {
    // hide or collapse the container
    container.style.display = "none";
  }
});

braze.requestBannersRefresh(["global_banner", "navigation_square_banner"]);

Si vous utilisez React avec le SDK Web Braze, appelez la méthode insertBanner avec une ref pour remplacer le HTML interne de l’élément conteneur.

import { useRef } from 'react';
import * as braze from "@braze/web-sdk";

export default function App() {
    const bannerRef = useRef<HTMLDivElement>(null);

    useEffect(() => {
       const globalBanner = braze.getBanner("global_banner");
       if (!globalBanner || globalBanner.isControl) {
           // hide the container
       } else {
           // insert the banner to the container node
           braze.insertBanner(globalBanner, bannerRef.current);
       }
    }, []);
    return <div ref={bannerRef}></div>
}

Après une actualisation, le SDK met à jour un BannerUIView ou un BannerView uniquement lorsque le contenu mis en cache de ce placement change (ajouté, supprimé ou mis à jour). Les Banners affichés inchangés restent tels quels. L’appel de changeUser() met à jour chaque vue de Banner enregistrée.

// To get access to the Banner model object:
let globalBanner: Braze.Banner?
AppDelegate.braze?.banners.getBanner(for: "global_banner", { banner in
  self.globalBanner = banner
})

// UIKit implementation:
// If you simply want the Banner view, initialize a `UIView` with the placement ID:
if let braze = AppDelegate.braze {
  let bannerUIView = BrazeBannerUI.BannerUIView(
    placementId: "global_banner",
    braze: braze,
    // iOS does not perform automatic resizing or visibility changes.
    // Use the `processContentUpdates` parameter to adjust the size and visibility of your Banner according to your use case.
    processContentUpdates: { result in
      switch result {
      case .success(let updates):
        if let height = updates.height {
          // Adjust the visibility and/or height.
        }
      case .failure(let error):
        // Handle the error.
      }
    }
  )
}

// SwiftUI implementation:
// Similarly, if you want a Banner view in SwiftUI, use the corresponding `BannerView` initializer:
if let braze = AppDelegate.braze {
  let bannerView = BrazeBannerUI.BannerView(
    placementId: "global_banner",
    braze: braze,
    // iOS does not perform automatic resizing or visibility changes.
    // Use the `processContentUpdates` parameter to adjust the size and visibility of your Banner according to your use case.
    processContentUpdates: { result in
      switch result {
      case .success(let updates):
        if let height = updates.height {
          // Adjust the visibility and/or height according to your parent controller.
        }
      case .failure(let error):
        // Handle the error.
      }
    }
  )
}

Après une actualisation, le SDK met à jour un BannerView uniquement lorsque le contenu mis en cache de ce placement change (ajouté, supprimé ou mis à jour). Les Banners affichés inchangés restent tels quels. L’appel de changeUser() met tout de même à jour chaque BannerView enregistré.

Pour obtenir le Banner en code Java, utilisez :

Banner globalBanner = Braze.getInstance(context).getBanner("global_banner");

Vous pouvez créer des Banners dans la disposition de vos vues Android en incluant ce XML :

<com.braze.ui.banners.BannerView
    android:id="@+id/global_banner_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:placementId="global_banner" />

Si vous utilisez des vues Android, utilisez ce XML :

<com.braze.ui.banners.BannerView
    android:id="@+id/global_banner_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:placementId="global_banner" />

Pour utiliser Jetpack Compose, ajoutez l’artefact com.braze:android-sdk-jetpack-compose au module de votre application. Utilisez la même version que vos autres dépendances du SDK Android Braze. Ce module est distinct de android-sdk-ui et fournit le composable Banner sous com.braze.jetpackcompose.banners.

import com.braze.jetpackcompose.banners.Banner

@Composable
fun myBannerSlot() {
    Banner(placementId = "global_banner")
}

Vous pouvez éventuellement passer heightCallback pour recevoir la hauteur rendue en dp lorsque la taille du banner change. Pour référence, consultez la KDoc de Banner.

Si vous n’ajoutez pas le module Jetpack Compose, encapsulez BannerView dans AndroidView :

import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.ui.viewinterop.AndroidView
import com.braze.ui.banners.BannerView

@Composable
fun myBannerSlot() {
    AndroidView(
        factory = { context ->
            BannerView(context, "global_banner").apply {
                layoutParams = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
                )
            }
        },
        update = { it.placementId = "global_banner" }
    )
}

Pour obtenir le Banner en Kotlin, utilisez :

val banner = Braze.getInstance(context).getBanner("global_banner")

Si vous utilisez la nouvelle architecture de React Native, vous devez enregistrer BrazeBannerView en tant que composant Fabric dans votre AppDelegate.mm.

#ifdef RCT_NEW_ARCH_ENABLED
/// Register the `BrazeBannerView` for use as a Fabric component.
- (NSDictionary<NSString *,Class<RCTComponentViewProtocol>> *)thirdPartyFabricComponents {
  NSMutableDictionary * dictionary = [super thirdPartyFabricComponents].mutableCopy;
  dictionary[@"BrazeBannerView"] = [BrazeBannerView class];
  return dictionary;
}
#endif

Pour l’intégration la plus simple, ajoutez l’extrait JavaScript XML (JSX) suivant dans votre hiérarchie de vues, en fournissant uniquement l’ID de placement.

<Braze.BrazeBannerView
  placementId='global_banner'
/>

Pour obtenir le modèle de données du Banner en React Native, ou pour vérifier la présence de ce placement dans le cache de votre utilisateur, utilisez :

const banner = await Braze.getBanner("global_banner");
This feature is not currently supported on Unity.
This feature is not currently supported on Cordova.

Pour l’intégration la plus simple, ajoutez le widget suivant dans votre hiérarchie de vues, en fournissant uniquement l’ID de placement.

BrazeBannerView(
  placementId: "global_banner",
),
To get the Banner's data model in Flutter, use:

Vous pouvez utiliser la méthode getBanner pour vérifier la présence de ce placement dans le cache de votre utilisateur.

braze.getBanner("global_banner").then((banner) {
  if (banner == null) {
    // Handle null cases.
  } else {
    print(banner.toString());
  }
});
This feature is not currently supported on Roku.

Étape 5 : Envoyer un Banner de test (facultatif)

Avant de lancer une Campaign de Banner, vous pouvez envoyer un Banner de test pour vérifier votre intégration. Les Banners de test sont stockés dans un cache en mémoire séparé et ne persistent pas après le redémarrage de l’application. Aucune configuration supplémentaire n’est nécessaire, mais votre appareil de test doit être capable de recevoir des notifications push au premier plan pour pouvoir afficher le test.

Enregistrer les impressions

Braze enregistre automatiquement les impressions pour les Banners visibles à l’écran lorsque vous utilisez les méthodes du SDK pour insérer un Banner — il n’est donc pas nécessaire de suivre les impressions manuellement.

Enregistrement des clics

La méthode utilisée pour enregistrer les clics sur les bannières dépend de la façon dont votre bannière est rendue et de l’emplacement de votre gestionnaire de clics.

Contenu de bannière standard (automatique)

Si vous utilisez les méthodes SDK par défaut et prêtes à l’emploi pour insérer des bannières, et que votre bannière utilise des composants standard de l’éditeur (images, boutons, texte), les clics sont suivis automatiquement. Le SDK attache des écouteurs de clics à ces éléments, et aucun code supplémentaire n’est nécessaire.

Blocs de code personnalisé

Si votre bannière utilise le bloc éditeur Custom Code dans le tableau de bord de Braze, vous devez utiliser brazeBridge.logClick() pour enregistrer les clics depuis ce HTML personnalisé. Cela s’applique même lorsque vous utilisez les méthodes SDK pour afficher la bannière, car le SDK ne peut pas attacher automatiquement des écouteurs aux éléments à l’intérieur de votre code personnalisé.

<button onclick="brazeBridge.logClick()">
  Click me
</button>

Pour la référence complète, consultez Code personnalisé et pont JavaScript pour les bannières. Le brazeBridge fournit une couche de communication entre le HTML interne de la bannière et le SDK Braze parent.

Implémentations d’interface personnalisées (headless)

Si vous créez une interface entièrement personnalisée en utilisant les propriétés personnalisées de la bannière plutôt que de rendre le HTML de la bannière, vous devez enregistrer manuellement les clics et les impressions depuis le code de votre application. Comme le SDK ne rend pas la bannière, il n’a aucun moyen de suivre automatiquement les interactions avec vos éléments d’interface personnalisés.

Pour les signatures de méthodes et les détails complets, consultez la documentation de référence du SDK Braze.

Enregistrement des impressions

Appelez la méthode d’impression de bannière de la plateforme lorsque votre interface personnalisée considère la bannière comme « vue ». Construisez une logique robuste pour déterminer ce qui compte comme une impression afin d’éviter les événements en double — par exemple, enregistrez uniquement lorsque la bannière entre dans la zone d’affichage (ou équivalent), et n’enregistrez pas de nouveau lorsque la même bannière revient dans la zone visible ou lorsque votre composant se re-rend sans nouvel événement de visualisation.

import * as braze from "@braze/web-sdk";

// Log impression when your custom UI considers the banner viewed (for example, once when it enters viewport)
const banner = braze.getBanner("placement_id_homepage_top");
if (banner) {
  braze.logBannerImpressions([banner]);
}

Référence du SDK Web

// Log impression when your custom UI considers the banner viewed (for example, once when it enters viewport)
Braze.getInstance(context).logBannerImpression("placement_id_homepage_top")
// Log impression when your custom UI considers the banner viewed (for example, once when it enters viewport)
Braze.getInstance(context).logBannerImpression("placement_id_homepage_top");

Référence du SDK Android

// Retrieve a banner and log an impression on it (for example, once when it enters viewport)
braze.banners.getBanner(for: "placement_id_homepage_top") { banner in
  banner?.context.logImpression()
}

Référence du SDK Swift

// Log impression when your custom UI considers the banner viewed (for example, once when it enters viewport)
Braze.logBannerImpression("placement_id_homepage_top");

Consultez le dépôt du SDK React Native pour les signatures de méthodes les plus récentes.

// Log impression when your custom UI considers the banner viewed (for example, once when it enters viewport)
braze.logBannerImpression("placement_id_homepage_top");

Référence du SDK Flutter

Enregistrement des clics

Appelez la méthode de clic de bannière de la plateforme lorsque l’utilisateur appuie sur votre bannière personnalisée (ou sur un bouton spécifique). Passez le paramètre optionnel buttonId lorsque le clic concerne un bouton spécifique afin que l’analytique puisse attribuer correctement le clic.

import * as braze from "@braze/web-sdk";

// Log click
braze.logBannerClick("placement_id_homepage_top", buttonId);  // buttonID is optional

Référence du SDK Web

// Log click
Braze.getInstance(context).logBannerClick("placement_id_homepage_top", buttonId)  // buttonID parameter can be null
// Log click
Braze.getInstance(context).logBannerClick("placement_id_homepage_top", buttonId);  // buttonID parameter can be null

Référence du SDK Android

// Retrieve a banner and log a click on it
braze.banners.getBanner(for: "placement_id_homepage_top") { banner in
  banner?.context.logClick(buttonId: buttonId)  // buttonID is optional
}

Référence du SDK Swift

// Log click
Braze.logBannerClick("placement_id_homepage_top", buttonId);  // buttonID is optional

Consultez le dépôt du SDK React Native pour les signatures de méthodes les plus récentes.

// Log click
braze.logBannerClicked("placement_id_homepage_top", buttonId);  // buttonID parameter can be null

Référence du SDK Flutter

Enregistrer les rejets

Les rejets de bannières suppriment programmatiquement une bannière d’un emplacement lorsqu’un utilisateur la rejette activement. Lorsqu’elle est rejetée, la bannière est masquée pour cet utilisateur. Lors du prochain rafraîchissement de la liste des emplacements, une nouvelle bannière est renvoyée si l’utilisateur est éligible.

Prérequis

Voici les versions minimales du SDK requises pour enregistrer les rejets de bannières :

Intégrations

Intégrations standard de bannières (éditeur par glisser-déposer)

Si votre bannière utilise l’éditeur par glisser-déposer et inclut un composant de bouton de rejet, aucun code supplémentaire n’est nécessaire. Lorsqu’un utilisateur clique sur le bouton de rejet, le message est masqué, un rejet est déclenché, puis un événement de rejet est enregistré à des fins d’analyse.

Blocs de code personnalisé

Si votre bannière utilise le bloc éditeur Custom Code, vous pouvez déclencher un rejet directement depuis le HTML de la bannière en utilisant brazeBridge.closeMessage().

<button onclick="brazeBridge.closeMessage()">
  Dismiss
</button>

Rejeter une bannière de manière programmatique

Si vous utilisez le BrazeBannerView standard avec le bouton de rejet créé dans l’éditeur par glisser-déposer, aucun code supplémentaire n’est nécessaire ; le rejet est géré automatiquement.

Pour les intégrations d’interface personnalisée, vous pouvez appeler la méthode de rejet directement sur votre instance Braze pour rejeter une bannière de manière programmatique et enregistrer un événement de rejet. La méthode de rejet peut être appelée plusieurs fois en toute sécurité — le SDK ignore les appels en double pour la même bannière.

Voici les versions minimales du SDK requises pour rejeter une bannière de manière programmatique :

Passez l’objet Banner à braze.dismissBanner(). Vous pouvez obtenir l’objet Banner à partir de braze.getAllBanners() ou d’un rappel subscribeToBannersUpdates.

import * as braze from "@braze/web-sdk";

const banners = braze.getAllBanners();
const banner = banners["global_banner"];

if (banner) {
  braze.dismissBanner(banner);
}
import * as braze from "@braze/web-sdk";

const banners = braze.getAllBanners();
const banner = banners["global_banner"];

if (banner) {
  braze.dismissBanner(banner);
}
Braze.getInstance(context).dismissBanner("your-placement-id");
Braze.getInstance(context).dismissBanner("your-placement-id")

Utilisez dismiss() sur le contexte de la bannière lorsqu’il est disponible. Cette méthode est idempotente et déclenche automatiquement le rappel onDismiss. Si le contexte n’est pas disponible, appelez dismiss(using:) directement sur la bannière. Les deux méthodes doivent être appelées depuis le thread principal.

// Preferred: dismiss via context.
banner.context?.dismiss()

// Fallback: if context is unavailable.
banner.dismiss(using: braze)

En Objective-C, celles-ci sont disponibles sous la forme [banner.context dismiss] et [banner dismissUsing:braze].

Braze.dismissBanner("your-placement-id");
braze.dismissBanner("your-placement-id");

Enregistrer des analyses personnalisées lors du rejet d’une bannière

Pour exécuter une logique personnalisée lorsqu’une bannière est rejetée — comme l’enregistrement d’analyses — utilisez le rappel de rejet de votre SDK. Le rappel reçoit un objet événement contenant le placementId, le stableKey et le trackingId de la bannière.

Utilisez Banner.subscribeToDismissedEvent() pour exécuter une logique personnalisée lorsqu’une bannière spécifique est rejetée. Abonnez-vous à l’événement avant d’afficher la bannière.

import * as braze from "@braze/web-sdk";

braze.subscribeToBannersUpdates((banners) => {
  const banner = banners["global_banner"];

  if (banner) {
    banner.subscribeToDismissedEvent(() => {
      // Run any custom logic here, such as logging custom analytics
      console.log("Banner was dismissed");
    });
  }
});

braze.requestBannersRefresh(["global_banner"]);
import { useEffect } from "react";
import * as braze from "@braze/web-sdk";

useEffect(() => {
  const subscriptionId = braze.subscribeToBannersUpdates((banners) => {
    const banner = banners["global_banner"];

    if (banner) {
      banner.subscribeToDismissedEvent(() => {
        // Run any custom logic here, such as logging custom analytics
        console.log("Banner was dismissed");
      });
    }
  });

  braze.requestBannersRefresh(["global_banner"]);

  return () => {
    braze.removeSubscription(subscriptionId);
  };
}, []);

Définissez la propriété optionnelle onDismissCallback sur BannerView.

import android.util.Log;
import com.braze.ui.banners.BannerView;
import kotlin.Unit;

// After obtaining your BannerView instance (for example from XML via findViewById, or `new BannerView(context, "global_banner")`)

bannerView.setOnDismissCallback((snapshot) -> {
  Log.d(TAG, "placementId: " + snapshot.getPlacementId()
    + ", stableKey: " + snapshot.getStableKey()
    + ", trackingId: " + snapshot.getTrackingId());

  // Run any custom logic here, such as logging custom analytics
  return Unit.INSTANCE;
});
import android.util.Log
import com.braze.ui.banners.BannerView

// After obtaining your BannerView instance (for example via findViewById or `BannerView(context, "global_banner")`)

bannerView.onDismissCallback = { snapshot ->
  Log.d(TAG, "placementId: ${snapshot.placementId}, stableKey: ${snapshot.stableKey}, trackingId: ${snapshot.trackingId}")

  // Run any custom logic here, such as logging custom analytics
}
// After initializing your banner view instance using UIKit or SwiftUI

bannerView.onDismiss = { event in
  print("Banner dismissed — placementId: \(event.placementId ?? "unknown")")
  print("  stableKey: \(event.stableKey ?? "unknown")")
  print("  trackingId: \(event.trackingId ?? "unknown")")

  // Run any custom logic here, such as logging custom analytics
}

Définissez la propriété onDismiss sur Braze.BrazeBannerView pour exécuter une logique personnalisée lorsqu’une bannière est rejetée.

import Braze from "@braze/react-native-sdk";

<Braze.BrazeBannerView
  placementId="global_banner"
  onDismiss={(event) => {
    console.log("placementId:", event.placementId, "stableKey:", event.stableKey, "trackingId:", event.trackingId);
    // Run any custom logic here, such as logging custom analytics
  }}
/>

Définissez le paramètre onDismiss sur BrazeBannerView pour exécuter une logique personnalisée lorsqu’une bannière est rejetée.

BrazeBannerView(
  placementId: 'global_banner',
  onDismiss: (BrazeBannerDismissEvent event) {
    print('placementId: ${event.placementId}, stableKey: ${event.stableKey}, trackingId: ${event.trackingId}');
    // Run any custom logic here, such as logging custom analytics
  },
)

Limite de stockage des rejets en attente

Les événements de rejet sont stockés localement en tant qu’entrées en attente jusqu’à ce qu’ils puissent être synchronisés avec le serveur Braze lors du prochain appel à requestBannersRefresh.

Dimensions et dimensionnement

Voici ce que vous devez savoir sur les dimensions et le dimensionnement des Banners :

  • Bien que le compositeur vous permette de prévisualiser les Banners dans différentes dimensions, ces informations ne sont ni enregistrées ni envoyées au SDK.
  • Le HTML occupera toute la largeur du conteneur dans lequel il est affiché.
  • Nous vous recommandons de créer un élément à dimensions fixes et de tester ces dimensions dans le compositeur.

Propriétés personnalisées

Vous pouvez utiliser les propriétés personnalisées de votre campagne de bannières pour récupérer des données clé-valeur via le SDK et modifier le comportement ou l’apparence de votre application. Par exemple, vous pourriez :

  • Envoyer des métadonnées pour vos analyses tierces ou intégrations.
  • Utiliser des métadonnées telles qu’un timestamp ou un objet JSON pour déclencher une logique conditionnelle.
  • Contrôler le comportement d’un Banner en fonction de métadonnées incluses comme ratio ou format.

Conditions préalables

Vous devez ajouter des propriétés personnalisées à votre campagne de bannières. De plus, voici les versions minimales du SDK requises pour accéder aux propriétés personnalisées :

Accéder aux propriétés personnalisées

Pour accéder aux propriétés personnalisées d’une bannière, utilisez l’une des méthodes suivantes en fonction du type de propriété défini dans le tableau de bord. Si la clé ne correspond pas à une propriété de ce type ou n’existe pas, la méthode renvoie null.

// Returns the Banner instance
const banner = braze.getBanner("placement_id_homepage_top");

// banner may be undefined or null
if (banner) {

  // Returns the string property
  const stringProperty = banner.getStringProperty("color");

  // Returns the boolean property
  const booleanProperty = banner.getBooleanProperty("expanded");

  // Returns the number property
  const numberProperty = banner.getNumberProperty("height");

  // Returns the timestamp property (as a number)
  const timestampProperty = banner.getTimestampProperty("account_start");

  // Returns the image URL property as a string of the URL
  const imageProperty = banner.getImageProperty("homepage_icon");

  // Returns the JSON object property
  const jsonObjectProperty = banner.getJsonProperty("footer_settings");
}
// Passes the specified banner to the completion handler
AppDelegate.braze?.banners.getBanner(for: "placement_id_homepage_top") { banner in
  // Returns the string property
  let stringProperty: String? = banner.stringProperty(key: "color")

  // Returns the boolean property
  let booleanProperty: Bool? = banner.boolProperty(key: "expanded")

  // Returns the number property as a double
  let numberProperty: Double? = banner.numberProperty(key: "height")

  // Returns the Unix UTC millisecond timestamp property as an integer
  let timestampProperty: Int? = banner.timestampProperty(key: "account_start")

  // Returns the image property as a String of the image URL
  let imageProperty: String? = banner.imageProperty(key: "homepage_icon")

  // Returns the JSON object property as a [String: Any] dictionary
  let jsonObjectProperty: [String: Any]? = banner.jsonObjectProperty(key: "footer_settings")
}
// Returns the Banner instance
Banner banner = Braze.getInstance(context).getBanner("placement_id_homepage_top");

// banner may be undefined or null
if (banner != null) {
  // Returns the string property
  String stringProperty = banner.getStringProperty("color");

  // Returns the boolean property
  Boolean booleanProperty = banner.getBooleanProperty("expanded");

  // Returns the number property
  Number numberProperty = banner.getNumberProperty("height");

  // Returns the timestamp property (as a Long)
  Long timestampProperty = banner.getTimestampProperty("account_start");

  // Returns the image URL property as a String of the URL
  String imageProperty = banner.getImageProperty("homepage_icon");

  // Returns the JSON object property as a JSONObject
  JSONObject jsonObjectProperty = banner.getJSONProperty("footer_settings");
}
// Returns the Banner instance
val banner: Banner = Braze.getInstance(context).getBanner("placement_id_homepage_top") ?: return

// Returns the string property
val stringProperty: String? = banner.getStringProperty("color")

// Returns the boolean property
val booleanProperty: Boolean? = banner.getBooleanProperty("expanded")

// Returns the number property
val numberProperty: Number? = banner.getNumberProperty("height")

// Returns the timestamp property (as a Long)
val timestampProperty: Long? = banner.getTimestampProperty("account_start")

// Returns the image URL property as a String of the URL
val imageProperty: String? = banner.getImageProperty("homepage_icon")

// Returns the JSON object property as a JSONObject
val jsonObjectProperty: JSONObject? = banner.getJSONProperty("footer_settings")
// Get the Banner instance
const banner = await Braze.getBanner('placement_id_homepage_top');
if (!banner) return;

// Get the string property
const stringProperty = banner.getStringProperty('color');

// Get the boolean property
const booleanProperty = banner.getBooleanProperty('expanded');

// Get the number property
const numberProperty = banner.getNumberProperty('height');

// Get the timestamp property (as a number)
const timestampProperty = banner.getTimestampProperty('account_start');

// Get the image URL property as a string
const imageProperty = banner.getImageProperty('homepage_icon');

// Get the JSON object property
const jsonObjectProperty = banner.getJSONProperty('footer_settings');
// Fetch the banner asynchronously
_braze.getBanner(placementId).then(('placement_id_homepage_top') {
  // Get the string property
  final String? stringProperty = banner?.getStringProperty('color');

  // Get the boolean property
  final bool? booleanProperty = banner?.getBooleanProperty('expanded');

  // Get the number property
  final num? numberProperty = banner?.getNumberProperty('height');

  // Get the timestamp property
  final int? timestampProperty = banner?.getTimestampProperty('account_start');

  // Get the image URL property
  final String? imageProperty = banner?.getImageProperty('homepage_icon');

  // Get the JSON object property
  final Map<String, dynamic>? jsonObjectProperty = banner?.getJSONProperty('footer_settings');

  // Use these properties as needed in your UI or logic
});
New Stuff!