Criar cartões de conteúdo
Este artigo discute a abordagem básica que você usará ao implementar Cartões de conteúdo personalizados, bem como três casos de uso comuns. Ele pressupõe que você já tenha lido os outros artigos do guia de personalização de Cartões de conteúdo para entender o que pode ser feito por padrão e o que requer código personalizado. É especialmente útil entender como registrar análises de dados para seus Cartões de conteúdo personalizados.
Usando cartões de conteúdo de conteúdo de banner? Experimente os banners -perfeitos para mensagens em linha e persistentes no app e na Internet.
Criando um cartão
Etapa 1: Criar uma interface de usuário personalizada
Primeiro, crie seu componente HTML personalizado que será usado para renderizar os cartões.
Primeiro, crie seu próprio fragmento personalizado. O ContentCardsFragment padrão foi projetado apenas para lidar com nossos tipos de cartão de conteúdo padrão, mas é um bom ponto de partida.
Primeiro, crie seu próprio componente personalizado de view controller. O BrazeContentCardUI.ViewController padrão foi projetado apenas para lidar com nossos tipos de cartão de conteúdo padrão, mas é um bom ponto de partida.
Etapa 2: Assine as atualizações do cartão
Registre uma função de retorno de chamada para se inscrever em atualizações de dados quando os cartões forem atualizados. Você pode analisar os objetos de cartão de conteúdo e extrair os dados da carga útil, como title, cardDescription e imageUrl, e então usar os dados do modelo resultante para preencher sua interface personalizada.
Para obter os modelos de dados do cartão de conteúdo, inscreva-se nas atualizações de Cartões de conteúdo. Preste atenção especial às seguintes propriedades:
id: Representa a string de ID do cartão de conteúdo. Este é o identificador único usado para registrar análises de dados de Cartões de conteúdo personalizados.extras: Engloba todos os pares de valores-chave do dashboard da Braze.
Todas as propriedades fora de id e extras são opcionais para análise em Cartões de conteúdo personalizados. Para saber mais sobre o modelo de dados, consulte o artigo de integração de cada plataforma: Android, iOS, Web.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import * as braze from "@braze/web-sdk";
braze.subscribeToContentCardsUpdates((updates) => {
const cards = updates.cards;
// For example:
cards.forEach(card => {
if (card.isControl) {
// Do not display the control card, but remember to call `logContentCardImpressions([card])`
}
else if (card instanceof braze.ClassicCard || card instanceof braze.CaptionedImage) {
// Use `card.title`, `card.imageUrl`, etc.
}
else if (card instanceof braze.ImageOnly) {
// Use `card.imageUrl`, etc.
}
})
});
braze.openSession();
Os Cartões de conteúdo só são atualizados no início da sessão se subscribeToContentCardsUpdates() for chamado antes de openSession(). Você também pode atualizar o feed manualmente a qualquer momento.
Etapa 2a: Criar uma variável privada de assinante
Para se inscrever nas atualizações do cartão, primeiro declare uma variável privada na sua classe personalizada para armazenar seu assinante:
1
2
// subscriber variable
private IEventSubscriber<ContentCardsUpdatedEvent> mContentCardsUpdatedSubscriber;
Etapa 2b: Inscrever-se nas atualizações
Adicione o seguinte código para se inscrever nas atualizações de cartão de conteúdo da Braze, normalmente dentro do Activity.onCreate() da sua atividade personalizada de Cartões de conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Remove the previous subscriber before rebuilding a new one with our new activity.
Braze.getInstance(context).removeSingleSubscription(mContentCardsUpdatedSubscriber, ContentCardsUpdatedEvent.class);
mContentCardsUpdatedSubscriber = new IEventSubscriber<ContentCardsUpdatedEvent>() {
@Override
public void trigger(ContentCardsUpdatedEvent event) {
// List of all Content Cards
List<Card> allCards = event.getAllCards();
// Your logic below
}
};
Braze.getInstance(context).subscribeToContentCardsUpdates(mContentCardsUpdatedSubscriber);
Braze.getInstance(context).requestContentCardsRefresh();
Etapa 2c: Cancelar inscrição
Cancele a inscrição quando sua atividade personalizada sair da visualização. Adicione o seguinte código ao método de ciclo de vida onDestroy() da sua atividade:
1
Braze.getInstance(context).removeSingleSubscription(mContentCardsUpdatedSubscriber, ContentCardsUpdatedEvent.class);
Etapa 2a: Criar uma variável privada de assinante
Para se inscrever nas atualizações do cartão, primeiro declare uma variável privada na sua classe personalizada para armazenar seu assinante:
1
private var contentCardsUpdatedSubscriber: IEventSubscriber<ContentCardsUpdatedEvent>? = null
Etapa 2b: Inscrever-se nas atualizações
Adicione o seguinte código para se inscrever nas atualizações de cartão de conteúdo da Braze, normalmente dentro do Activity.onCreate() da sua atividade personalizada de Cartões de conteúdo:
1
2
3
4
5
6
7
8
9
10
// Remove the previous subscriber before rebuilding a new one with our new activity.
Braze.getInstance(context).subscribeToContentCardsUpdates(contentCardsUpdatedSubscriber)
Braze.getInstance(context).requestContentCardsRefresh()
// List of all Content Cards
val allCards = event.allCards
// Your logic below
}
Braze.getInstance(context).subscribeToContentCardsUpdates(mContentCardsUpdatedSubscriber)
Braze.getInstance(context).requestContentCardsRefresh(true)
Etapa 2c: Cancelar inscrição
Cancele a inscrição quando sua atividade personalizada sair da visualização. Adicione o seguinte código ao método de ciclo de vida onDestroy() da sua atividade:
1
Braze.getInstance(context).removeSingleSubscription(contentCardsUpdatedSubscriber, ContentCardsUpdatedEvent::class.java)
Para acessar o modelo de dados dos Cartões de conteúdo, chame contentCards.cards na sua instância braze.
1
let cards: [Braze.ContentCard] = AppDelegate.braze?.contentCards.cards
Além disso, você pode manter uma inscrição para observar alterações nos seus Cartões de conteúdo. Você pode fazer isso de duas maneiras:
- Mantendo um cancellable; ou
- Mantendo um
AsyncStream.
Cancellable
1
2
3
4
5
6
// This subscription is maintained through a Braze cancellable, which will observe for changes until the subscription is cancelled.
// You must keep a strong reference to the cancellable to keep the subscription active.
// The subscription is canceled either when the cancellable is deinitialized or when you call its `.cancel()` method.
let cancellable = AppDelegate.braze?.contentCards.subscribeToUpdates { [weak self] contentCards in
// Implement your completion handler to respond to updates in `contentCards`.
}
AsyncStream
1
let stream: AsyncStream<[Braze.ContentCard]> = AppDelegate.braze?.contentCards.cardsStream
1
NSArray<BRZContentCardRaw *> *contentCards = AppDelegate.braze.contentCards.cards;
Além disso, se você quiser manter uma inscrição nos seus cartões de conteúdo, pode chamar subscribeToUpdates:
1
2
3
4
// This subscription is maintained through Braze cancellable, which will continue to observe for changes until the subscription is cancelled.
BRZCancellable *cancellable = [self.braze.contentCards subscribeToUpdates:^(NSArray<BRZContentCardRaw *> *contentCards) {
// Implement your completion handler to respond to updates in `contentCards`.
}];
Etapa 3: Implementar análise de dados
As impressões, os cliques e os descartes de cartão de conteúdo não são registrados automaticamente na sua visualização personalizada. É necessário implementar cada método respectivo para registrar adequadamente todas as métricas na análise de dados do dashboard da Braze.
Etapa 4: Teste seu cartão (opcional)
Para testar seu cartão de conteúdo:
- Defina um usuário ativo no seu app chamando o método
changeUser(). - Na Braze, acesse Campanhas e crie uma nova campanha de cartão de conteúdo.
- Na sua campanha, selecione Teste e insira o
user-iddo usuário teste. Quando estiver pronto, selecione Enviar Teste. Você poderá lançar um cartão de conteúdo no seu dispositivo em breve.

Posicionamentos de Cartões de conteúdo
Os Cartões de conteúdo podem ser usados de muitas maneiras diferentes. Três implementações comuns são usá-los como centro de mensagens, anúncio de imagem dinâmico ou carrossel de imagens. Para cada um desses posicionamentos, você atribuirá pares de valores-chave (a propriedade extras no modelo de dados) aos seus Cartões de conteúdo e, com base nos valores, ajustará dinamicamente o comportamento, a aparência ou a funcionalidade do cartão durante o tempo de execução.

Caixa de entrada de mensagens
Os Cartões de conteúdo podem ser usados para simular um centro de mensagens. Nesse formato, cada mensagem é seu próprio cartão que contém pares de valores-chave que acionam eventos de clique. Esses pares de valores-chave são os identificadores-chave que o app analisa ao decidir para onde ir quando o usuário clica em uma mensagem da caixa de entrada. Os valores dos pares de valores-chave são arbitrários.
Exemplo
Por exemplo, você pode querer criar dois cartões de mensagem: um chamado à ação para os usuários ativarem recomendações de leitura e um código de cupom dado ao seu novo segmento de assinantes.
Chaves como body, title e buttonText podem ter valores simples de string que seus profissionais de marketing podem definir. Chaves como terms podem ter valores que fornecem uma pequena coleção de frases aprovadas pelo seu departamento jurídico. Chaves como style e class_type têm valores de string que você pode definir para determinar como seu cartão é exibido no seu app ou site.
Pares de valores-chave para o cartão de recomendação de leitura:
| Chave | Valor |
|---|---|
body |
Adicione seus interesses ao seu perfil do Politer Weekly para obter recomendações pessoais de leitura. |
style |
info |
class_type |
notification_center |
card_priority |
1 |
Pares de valores-chave para um novo cupom de assinante:
| Chave | Valor |
|---|---|
title |
Assine para obter jogos ilimitados |
body |
Especial de Despedida do Verão - 10% de desconto nos jogos Politer |
buttonText |
Assine agora |
style |
promo |
class_type |
notification_center |
card_priority |
2 |
terms |
new_subscribers_only |
Informações adicionais para Android
No SDK do Android e do FireOS, a lógica do centro de mensagens é orientada pelo valor class_type, que é fornecido pelos pares de valores-chave da Braze. Usando o método createContentCardable, você pode filtrar e identificar esses tipos de classe.
Usando class_type para comportamento ao clicar
Quando inflamos os dados do cartão de conteúdo em nossas classes personalizadas, usamos a propriedade ContentCardClass dos dados para determinar qual subclasse concreta deve ser usada para armazenar os dados.
1
2
3
4
5
6
7
8
9
10
11
private fun createContentCardable(metadata: Map<String, Any>, type: ContentCardClass?): ContentCardable?{
return when(type){
ContentCardClass.AD -> Ad(metadata)
ContentCardClass.MESSAGE_WEB_VIEW -> WebViewMessage(metadata)
ContentCardClass.NOTIFICATION_CENTER -> FullPageMessage(metadata)
ContentCardClass.ITEM_GROUP -> Group(metadata)
ContentCardClass.ITEM_TILE -> Tile(metadata)
ContentCardClass.COUPON -> Coupon(metadata)
else -> null
}
}
Então, ao lidar com a interação do usuário com a lista de mensagens, podemos usar o tipo de mensagem para determinar qual visualização será exibida ao usuário.
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
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
listView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
when (val card = dataProvider[position]){
is WebViewMessage -> {
val intent = Intent(this, WebViewActivity::class.java)
val bundle = Bundle()
bundle.putString(WebViewActivity.INTENT_PAYLOAD, card.contentString)
intent.putExtras(bundle)
startActivity(intent)
}
is FullPageMessage -> {
val intent = Intent(this, FullPageContentCard::class.java)
val bundle = Bundle()
bundle.putString(FullPageContentCard.CONTENT_CARD_IMAGE, card.icon)
bundle.putString(FullPageContentCard.CONTENT_CARD_TITLE, card.messageTitle)
bundle.putString(FullPageContentCard.CONTENT_CARD_DESCRIPTION, card.cardDescription)
intent.putExtras(bundle)
startActivity(intent)
}
}
}
}
Usando class_type para comportamento ao clicar
Quando inflamos os dados do cartão de conteúdo em nossas classes personalizadas, usamos a propriedade ContentCardClass dos dados para determinar qual subclasse concreta deve ser usada para armazenar os dados.
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
private ContentCardable createContentCardable(Map<String, ?> metadata, ContentCardClass type){
switch(type){
case ContentCardClass.AD:{
return new Ad(metadata);
}
case ContentCardClass.MESSAGE_WEB_VIEW:{
return new WebViewMessage(metadata);
}
case ContentCardClass.NOTIFICATION_CENTER:{
return new FullPageMessage(metadata);
}
case ContentCardClass.ITEM_GROUP:{
return new Group(metadata);
}
case ContentCardClass.ITEM_TILE:{
return new Tile(metadata);
}
case ContentCardClass.COUPON:{
return new Coupon(metadata);
}
default:{
return null;
}
}
}
Então, ao lidar com a interação do usuário com a lista de mensagens, podemos usar o tipo de mensagem para determinar qual visualização será exibida ao usuário.
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
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
//...
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
ContentCardable card = dataProvider.get(position);
if (card instanceof WebViewMessage){
Bundle intent = new Intent(this, WebViewActivity.class);
Bundle bundle = new Bundle();
bundle.putString(WebViewActivity.INTENT_PAYLOAD, card.getContentString());
intent.putExtras(bundle);
startActivity(intent);
}
else if (card instanceof FullPageMessage){
Intent intent = new Intent(this, FullPageContentCard.class);
Bundle bundle = Bundle();
bundle.putString(FullPageContentCard.CONTENT_CARD_IMAGE, card.getIcon());
bundle.putString(FullPageContentCard.CONTENT_CARD_TITLE, card.getMessageTitle());
bundle.putString(FullPageContentCard.CONTENT_CARD_DESCRIPTION, card.getCardDescription());
intent.putExtras(bundle)
startActivity(intent)
}
}
});
}
Carrossel
É possível definir Cartões de conteúdo em seu feed de carrossel totalmente personalizado, permitindo que os usuários deslizem e visualizem cartões adicionais em destaque. Por padrão, os Cartões de conteúdo são classificados por data de criação (o mais recente primeiro), e seus usuários verão todos os cartões para os quais são elegíveis.
Para implementar um carrossel de Cartões de conteúdo:
- Crie uma lógica personalizada que observe as alterações nos seus Cartões de conteúdo e lide com a chegada de Cartões de conteúdo.
- Crie uma lógica personalizada no lado do cliente para exibir um número específico de cartões no carrossel em um determinado momento. Por exemplo, você pode selecionar os cinco primeiros objetos de cartão de conteúdo do array ou introduzir pares de valores-chave para criar uma lógica condicional.
Se estiver implementando um carrossel como um feed secundário de Cartões de conteúdo, certifique-se de classificar os cartões no feed correto usando pares de valores-chave.
Apenas imagem
Os Cartões de conteúdo não precisam se parecer com “cartões”. Por exemplo, os Cartões de conteúdo podem aparecer como uma imagem dinâmica que é exibida persistentemente na sua página inicial ou no topo de páginas designadas.
Para isso, seus profissionais de marketing criarão uma campanha ou etapa do canva com um tipo de cartão de conteúdo Apenas Imagem. Em seguida, defina os pares de valores-chave apropriados para usar os Cartões de conteúdo como conteúdo suplementar.
Editar esta página no GitHub