Gerenciar a colocação de banners
Saiba como criar e gerenciar posicionamentos de banner no SDK do Braze, incluindo o acesso a suas propriedades exclusivas e o registro de impressões. Para saber mais sobre informações gerais, consulte Sobre banners.
Sobre solicitações de colocação
Quando você cria posicionamentos em seu aplicativo ou site, seu app envia uma solicitação ao Braze para buscar mensagens de banner para cada posicionamento.
- Você pode solicitar até 10 colocações por solicitação de atualização.
- Para cada colocação, o Braze retorna o Banner de maior prioridade que o usuário é elegível para receber.
- Se mais de 10 posicionamentos forem solicitados em uma atualização, apenas os 10 primeiros serão retornados; os demais serão descartados.
Por exemplo, um app pode solicitar três posicionamentos em uma solicitação de atualização: homepage_promo, cart_abandonment, e seasonal_offer. Cada solicitação retorna o banner mais relevante para aquele posicionamento.
Limite de frequência para solicitações de atualização
Se você estiver em versões mais antigas do SDK (antes de Swift 13.1.0, Android 38.0.0, Web 6.1.0, React Native 17.0.0 e Flutter 15.0.0), somente uma solicitação de atualização é permitida por sessão de usuário.
Se você estiver em versões mais recentes do SDK mínimo (Swift 13.1.0+, Android 38.0.0+, Web 6.1.0+, React Native 17.0.0+ e Flutter 15.0.0+), as solicitações de atualização serão controladas por um algoritmo de token bucket para evitar o polling excessivo:
- Cada sessão de usuário começa com cinco tokens de atualização.
- Os tokens são recarregados a uma taxa de um token a cada 180 segundos (3 minutos).
Cada chamada para requestBannersRefresh consome um token. Se tentar uma atualização quando não houver tokens disponíveis, o SDK não fará a solicitação e registrará um erro até que um token seja reabastecido. Isso é importante para atualizações no meio da sessão e disparadas por eventos. Para implementar atualizações dinâmicas (por exemplo, depois que um usuário concluir uma ação na mesma página), chame o método refresh depois que o evento personalizado for registrado, mas note a postergação necessária para que o Braze ingira e processe o evento antes que o usuário se qualifique para uma campanha de Banner diferente.
Criação de um posicionamento
Pré-requisitos
Essas são as versões mínimas do SDK necessárias para criar posicionamentos de banner:
Etapa 1: Criar posicionamentos no Braze
Se ainda não o fez, você precisará criar posicionamentos de banner no Braze, que são usados para definir os locais em seu app ou site que podem exibir banners. Para criar um posicionamento, acesse Settings > Banners Placements ( Configurações > Posicionamentos de banners) e selecione Create Placement (Criar posicionamento).

Dê um nome à sua colocação e atribua uma ID de colocação. Certifique-se de consultar outras equipes antes de atribuir uma ID, pois ela será usada durante todo o ciclo de vida do cartão e não deve ser alterada posteriormente. Para saber mais, consulte Placement IDs.

Etapa 2: Atualize os canais em seu app
As colocações podem ser atualizadas chamando os métodos de atualização descritos abaixo. Esses posicionamentos serão armazenados em cache automaticamente quando a sessão de um usuário expirar ou quando você alterar os usuários identificados usando o método changeUser.
tip:
Atualize os posicionamentos o mais rápido possível para evitar postergações no download ou na exibição de Banners.
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.
|
Etapa 3: Ouça as atualizações
tip:
Se inserir banners usando os métodos do SDK neste guia, todos os eventos de análise de dados (como impressões e cliques) serão tratados automaticamente, e as impressões só serão registradas quando o banner estiver em exibição.
Se estiver usando vanilla JavaScript com o SDK do Braze Web, use subscribeToBannersUpdates para ouvir as atualizações de posicionamento e, em seguida, chamar requestBannersRefresh para obtê-las.
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"]);
|
Se estiver usando o React com o SDK do Web Braze, configure subscribeToBannersUpdates em um gancho useEffect e chame requestBannersRefresh depois de registrar seu ouvinte.
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.
|
Etapa 4: Inserir usando a ID de colocação
Crie um elemento de contêiner para o banner. Não se esqueça de definir sua largura e altura.
1
| <div id="global-banner-container" style="width: 100%; height: 450px;"></div>
|
Se estiver usando vanilla JavaScript com o SDK do Braze Web, chame o método insertBanner para substituir o HTML interno do elemento contêiner.
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"]);
|
Se estiver usando o React com o SDK do Web Braze, chame o método insertBanner com um ref para substituir o HTML interno do elemento do contêiner.
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>
}
|
tip:
Para rastrear impressões, não deixe de ligar para insertBanner para isControl. Depois disso, você pode ocultar ou recolher o contêiner.
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.
}
}
)
}
|
Para obter o banner no código Java, use:
1
| Banner globalBanner = Braze.getInstance(context).getBanner("global_banner");
|
Você pode criar banners em seu layout de visualizações do Android incluindo esse 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" />
|
Se estiver usando o Android Views, use este 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" />
|
Se estiver usando o Jetpack Compose, poderá usar isso:
1
| Banner(placementId = "global_banner")
|
Para obter o banner em Kotlin, use:
1
| val banner = Braze.getInstance(context).getBanner("global_banner")
|
Se estiver usando a Nova Arquitetura do React Native, será necessário registrar BrazeBannerView como um componente Fabric em seu 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
|
Para obter a integração mais simples, adicione o seguinte trecho de JavaScript XML (JSX) à hierarquia da visualização, fornecendo apenas o ID do posicionamento.
1
2
3
| <Braze.BrazeBannerView
placementID='global_banner'
/>
|
Para obter o modelo de dados do banner no React Native ou para verificar a presença desse posicionamento no cache do usuário, use:
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.
|
Para obter a integração mais simples, adicione o seguinte widget à hierarquia da visualização, fornecendo apenas o ID do posicionamento.
1
2
3
4
| BrazeBannerView(
placementId: "global_banner",
),
To get the Banner's data model in Flutter, use:
|
Você pode usar o método getBanner para verificar a presença desse posicionamento no cache do usuário.
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.
|
Etapa 5: Enviar um banner de teste (opcional)
Antes de lançar uma campanha de banner, você pode enviar um banner de teste para verificar sua integração. Os banners de teste serão armazenados em um cache separado na memória e não persistirão durante a reinicialização do app. Embora não seja necessária nenhuma configuração extra, seu dispositivo de teste deve ser capaz de receber notificações por push em primeiro plano para que possa exibir o teste.
note:
Os banners de teste são como qualquer outro banner, exceto pelo fato de serem removidos na próxima sessão do app.
Registro de impressões
O Braze registra automaticamente as impressões dos Banners que estão à vista quando você usa os métodos do SDK para inserir um Banner - portanto, não há necessidade de rastrear as impressões manualmente.
Dimensões e dimensionamento
Veja a seguir o que você precisa saber sobre as dimensões e o tamanho do Banner:
- Embora o criador permita que você faça uma prévia dos banners em diferentes dimensões, essas informações não são salvas nem enviadas ao SDK.
- O HTML ocupará toda a largura do contêiner em que for renderizado.
- Recomendamos criar um elemento de dimensão fixa e testar essas dimensões no criador.
Propriedades personalizadas
Você pode usar propriedades personalizadas da sua campanha de banner para recuperar dados de valor-chave por meio do SDK e modificar o comportamento ou a aparência do seu app. Por exemplo, você poderia:
- Envie metadados para suas análises de dados ou integrações de terceiros.
- Use metadados, como um objeto
timestamp ou JSON, para disparar a lógica condicional.
- Controle o comportamento de um banner com base em metadados incluídos, como
ratio ou format.
Pré-requisitos
Você precisará adicionar propriedades personalizadas à sua campanha de banner. Além disso, essas são as versões mínimas do SDK necessárias para acessar as propriedades personalizadas:
Acesso a propriedades personalizadas
Para acessar as propriedades personalizadas de um banner, use um dos seguintes métodos com base no tipo de propriedade definido no dashboard. Se a chave não corresponder a uma propriedade desse tipo ou não existir, o método retornará 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
});
|