Skip to content

Gérer les placements de bannières

Découvrez comment créer et gérer des placements de bannières dans le SDK de Braze, notamment en accédant à leurs propriétés uniques et en enregistrant les impressions. Pour plus d’informations générales, reportez-vous à la section À propos des bannières.

A propos des demandes de placement

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

  • Vous pouvez demander jusqu’à 10 placements par demande d’actualisation.
  • Pour chaque placement, Braze renvoie la bannière la plus prioritaire que l’utilisateur est susceptible de recevoir.
  • Si plus de 10 placements sont demandés lors d’une actualisation, seuls les 10 premiers sont renvoyés ; les autres sont abandonnés.

Par exemple, une application peut demander trois placements dans une demande d’actualisation : homepage_promo, cart_abandonment, et seasonal_offer. Chaque demande renvoie la bannière la plus pertinente pour ce placement.

Limite de débit pour les demandes d’actualisation

Si vous utilisez des versions plus anciennes du SDK (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 demande d’actualisation est autorisée par session d’utilisateur.

Si vous utilisez des versions minimales 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 demandes d’actualisation sont contrôlées par un algorithme de compartiment à jetons afin d’éviter un polling excessif :

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

Chaque appel à requestBannersRefresh consomme un jeton. Si vous tentez d’actualiser un jeton alors qu’aucun n’est disponible, le SDK n’effectue pas la demande et enregistre une erreur jusqu’à ce qu’un jeton soit à nouveau disponible. Ceci est important pour les mises à jour à mi-session et déclenchées par des événements. Pour mettre en œuvre des mises à jour dynamiques (par exemple, après qu’un utilisateur ait effectué une action sur la même page), appelez la méthode d’actualisation après l’enregistrement de l’événement personnalisé, mais notez le délai nécessaire à Braze pour ingérer et traiter l’événement avant que l’utilisateur ne se qualifie pour une autre campagne Banner.

Création d’un placement

Conditions préalables

Il s’agit des versions minimales du SDK nécessaires pour créer des placements de bannières :

Étape 1 : Créer des placements dans Braze

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

La section Placements de la bannière permet de créer des ID de placement.

Donnez un nom à votre placement et attribuez-lui un ID. Veillez à consulter les autres Teams 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, voir ID de placement.

Les détails du placement qui désignent une bannière s'afficheront dans la barre latérale gauche pour les campagnes de promotion des soldes de printemps.

Étape 2 : Actualiser les placements dans votre application

Les placements peuvent être actualisés en appelant les méthodes d’actualisation décrites ci-dessous. Ces placements seront automatiquement mis en cache à l’expiration de la session d’un utilisateur ou lorsque vous modifiez les utilisateurs identifiés à l’aide de la méthode changeUser.

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

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

Étape 3 : Écoutez les mises à jour

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

1
2
3
4
5
6
7
8
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 de Braze, mettez en place subscribeToBannersUpdates à l’intérieur d’un crochet useEffect et appelez requestBannersRefresh après avoir enregistré votre écouteur.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
  }
}, []);
1
2
3
4
5
let cancellable = brazeClient.braze()?.banners.subscribeToUpdates { banners in
  banners.forEach { placementId, banner in
    print("Received banner: \(banner) with placement ID: \(placementId)")
  }
}
1
2
3
4
5
Braze.getInstance(context).subscribeToBannersUpdates(banners -> {
  for (Banner banner : banners.getBanners()) {
    Log.d(TAG, "Received banner: " + banner.getPlacementId());
  }
});
1
2
3
4
5
Braze.getInstance(context).subscribeToBannersUpdates { update ->
  for (banner in update.banners) {
    Log.d(TAG, "Received banner: " + banner.placementId)
  }
}
1
2
3
4
5
6
7
8
9
10
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)
    );
  }
);
1
This feature is not currently supported on Unity.
1
This feature is not currently supported on Cordova.
1
2
3
4
5
StreamSubscription bannerStreamSubscription = braze.subscribeToBanners((List<BrazeBanner> banners) {
  for (final banner in banners) {
    print("Received banner: " + banner.toString());
  }
});
1
This feature is not currently supported on Roku.

Étape 4 : Insertion à l’aide de l’ID de placement

Créez un élément conteneur pour la bannière. Veillez à définir sa largeur et sa hauteur.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 Braze, appelez la méthode insertBanner avec une adresse ref pour remplacer le code HTML interne de l’élément conteneur.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// To get access to the Banner model object:
let globalBanner: Braze.Banner?
AppDelegate.braze?.banners.getBanner(for: "global_banner", { banner in
  self.globalBanner = banner
})

// If you simply want the Banner view, you may 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.
      }
    }
  )
}

// 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.
      }
    }
  )
}

Pour obtenir la bannière en code Java, utilisez :

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

Vous pouvez créer des bannières dans vos vues Android en incluant ce XML :

1
2
3
4
5
<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 Android Views, utilisez ce XML :

1
2
3
4
5
<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 Jetpack Compose, vous pouvez utiliser ceci :

1
Banner(placementId = "global_banner")

Pour obtenir la bannière en Kotlin, utilisez :

1
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 site AppDelegate.mm.

1
2
3
4
5
6
7
8
#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 de code JavaScript XML (JSX) suivant dans votre hiérarchie de vues, en fournissant uniquement l’ID de placement.

1
2
3
<Braze.BrazeBannerView
  placementID='global_banner'
/>

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

1
const banner = await Braze.getBanner("global_banner");
1
This feature is not currently supported on Unity.
1
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.

1
2
3
4
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.

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

Étape 5 : Envoyer une bannière de test (facultatif)

Avant de lancer une campagne de bannières, vous pouvez envoyer une bannière de test pour vérifier votre intégration. Les bannières de test seront stockées dans un cache en mémoire distinct et ne persisteront pas lors des redémarrages de l’application. Bien qu’aucune configuration supplémentaire ne soit nécessaire, votre appareil de test doit être capable de recevoir des notifications push au premier plan pour pouvoir afficher le test.

Enregistrement des impressions

Braze enregistre automatiquement les impressions des bannières visibles lorsque vous utilisez les méthodes du SDK pour insérer une bannière - il n’est donc pas nécessaire de suivre les impressions manuellement.

Dimensions et taille

Voici ce que vous devez savoir sur les dimensions des bannières :

  • Bien que le compositeur vous permette de prévisualiser les bannières dans différentes dimensions, cette information n’est pas enregistrée ou envoyée au SDK.
  • Le code HTML occupera toute la largeur du conteneur dans lequel il est affiché.
  • Nous vous recommandons de créer un élément de dimension fixe et de tester ces dimensions dans composer.

Propriétés personnalisées

Vous pouvez utiliser les propriétés personnalisées de votre campagne Banner 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 :

  • Envoyez des métadonnées pour vos analyses/analytiques tierces (si utilisées comme adjectifs).
  • Utilisez des métadonnées telles qu’un objet timestamp ou JSON pour déclencher une logique conditionnelle.
  • Contrôlez le comportement d’une bannière en fonction des métadonnées incluses comme ratio ou format.

Conditions préalables

Vous devrez ajouter des propriétés personnalisées à votre campagne Banner. En outre, il s’agit des versions minimales du SDK requises pour accéder aux propriétés personnalisées :

Accès 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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!