Inscrições de eventos
Saiba como as inscrições de eventos do SDK da Braze funcionam para Banners, Content Cards e Feature Flags. Este artigo explica quando cada evento é disparado e o que sua integração deve fazer a respeito.
Pré-requisitos
Estas são as versões mínimas do SDK necessárias para usar inscrições de eventos:
Sobre inscrições de eventos
Cada canal possui um método de inscrição de eventos. Você registra um retorno de chamada, e o SDK o invoca toda vez que algo acontece naquele canal, como uma reprodução de cache, uma atualização concluída, um evento de análise de dados ou um erro. Cada evento informa qual tipo de evento você recebeu.
Os métodos de inscrição de eventos substituem os métodos mais antigos de inscrição de atualização. Os métodos antigos entregam apenas os dados atuais. Os métodos de eventos também informam por que os dados mudaram, quando eventos de análise de dados são registrados e enviados, e quando uma solicitação falha.
| Canal | Método de inscrição de eventos | Substitui | Guia |
|---|---|---|---|
| Banners | subscribeToBannersEvents |
subscribeToBannersUpdates |
Gerenciar posicionamentos de Banner |
| Content Cards | subscribeToContentCardsEvents |
subscribeToContentCardsUpdates |
Criar Content Cards |
| Feature Flags | subscribeToFeatureFlagsEvents |
subscribeToFeatureFlagsUpdates |
Criar Feature Flags |

subscribeToBannersUpdates, subscribeToContentCardsUpdates e subscribeToFeatureFlagsUpdates estão descontinuados e serão removidos em uma versão principal futura. Use o método de inscrição de eventos correspondente.
| Canal | Método de inscrição de eventos | Substitui | Guia |
|---|---|---|---|
| Banners | braze.banners.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Gerenciar posicionamentos de Banner |
| Content Cards | braze.contentCards.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Criar Content Cards |
| Feature Flags | braze.featureFlags.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Criar Feature Flags |
Para a referência completa da API, consulte a documentação do BrazeKit.
Cada canal também possui uma propriedade eventsStream que entrega os mesmos eventos como um AsyncStream. Apps em Objective-C usam o método subscribeToEvents: nos mesmos objetos de canal.

O método antigo subscribeToUpdates(_:) e os streams de atualização por canal, como bannersStream, estão descontinuados. Use subscribeToEvents(_:) ou eventsStream.
| Canal | Método de inscrição de eventos | Classe de evento | Substitui | Guia |
|---|---|---|---|---|
| Banners | subscribeToBannersEvents |
BannersEvent |
subscribeToBannersUpdates |
Gerenciar posicionamentos de Banner |
| Content Cards | subscribeToContentCardsEvents |
ContentCardsEvent |
subscribeToContentCardsUpdates |
Criar Content Cards |
| Feature Flags | subscribeToFeatureFlagsEvents |
FeatureFlagsEvent |
subscribeToFeatureFlagsUpdates |
Criar Feature Flags |
Para a referência completa da API, consulte a KDoc do SDK Android da Braze.

subscribeToBannersUpdates, subscribeToContentCardsUpdates, subscribeToFeatureFlagsUpdates e subscribeToBannersErrors estão descontinuados. Use o método de inscrição de eventos correspondente.
Nomes por plataforma
Este artigo usa os nomes da Web para tipos de evento, motivos de atualização, estados de nova tentativa, ações de análise de dados e motivos de erro. Swift e Android usam os mesmos conceitos com nomes que seguem as convenções de cada plataforma.
| Web | Swift | Android |
|---|---|---|
CACHE_REPLAY |
cacheReplay |
CacheReplay |
CACHE_LOAD |
cacheLoad |
CacheLoad |
DATA_UPDATED |
dataUpdated |
DataUpdated |
IMPRESSION |
impressionEvent |
ImpressionEvent |
CLICK |
clickEvent |
ClickEvent |
DISMISS |
dismissEvent |
DismissEvent |
ERROR |
error |
ErrorEvent |
AUTO_SERVER_REFRESH |
autoServerRefresh |
AUTO_SERVER_REFRESH |
SDK_WILL_RETRY |
sdkWillRetry |
SDK_WILL_RETRY |
ENQUEUED |
enqueued |
ENQUEUED |
SERVER_ERROR |
.common(.serverError) |
Common(ErrorReason.ServerError) |
FEATURE_DISABLED |
.featureDisabled |
FeatureDisabled |
Os demais motivos de atualização, estados de nova tentativa, ações de análise de dados e motivos de erro seguem o mesmo padrão. No Swift, o tipo de motivo de atualização é Braze.ChannelUpdateReason. No Android, cada canal possui seu próprio tipo de motivo de atualização, como BannersUpdateReason.
Como os eventos são entregues
O SDK entrega eventos nesta ordem:
- Quando você se inscreve: O SDK invoca seu retorno de chamada imediatamente com um evento
CACHE_REPLAYcontendo os dados em cache. Se o canal estiver desativado, ele envia um eventoERRORcom o motivoFEATURE_DISABLED. Em ambos os casos, sua inscrição permanece ativa. - Quando o cache muda: O SDK envia um evento
CACHE_LOADse o cache mudou sem uma atualização do servidor, ou um eventoDATA_UPDATEDse uma atualização foi concluída ou se você alterou os dados localmente. - Quando você ou o SDK registram análise de dados: O SDK envia um evento
IMPRESSION,CLICKouDISMISScom a açãoENQUEUED, e o envia novamente com a açãoFLUSHEDapós a Braze aceitá-lo. - Quando algo falha: O SDK envia um evento
ERROR.
Seu retorno de chamada recebe o evento como seu único argumento. Trate cada tipo de evento com um switch sobre o tipo do evento. Na Web, o SDK registra um erro que seu retorno de chamada lança e ainda entrega o evento para outros assinantes.
import * as braze from "@braze/web-sdk";
// Register the subscription
const subscriptionId = braze.subscribeToBannersEvents((event) => {
switch (event.type) {
case braze.ChannelEventType.CACHE_REPLAY:
// Sent once, right away, with the cached data
break;
case braze.ChannelEventType.DATA_UPDATED:
// A refresh finished or the data changed locally
break;
case braze.ChannelEventType.ERROR:
// A request or analytics operation failed
break;
}
});
// Remove the subscription when you no longer need it
braze.removeSubscription(subscriptionId);

Chame o método de inscrição de eventos após inicializar o SDK. Chame-o antes de openSession() para que seu retorno de chamada receba os eventos da primeira sessão. Se o SDK estiver desativado, o método retorna undefined.
// Register the subscription and keep a strong reference to it
let cancellable = AppDelegate.braze?.banners.subscribeToEvents { event in
switch event {
case .cacheReplay(let cacheSnapshot):
// Sent once, right away, with the cached data
break
case .dataUpdated(let cacheSnapshot, let reason):
// A refresh finished or the data changed locally
break
case .error(let reason, let retryState):
// A request or analytics operation failed
break
default:
break
}
}
// Remove the subscription when you no longer need it
cancellable?.cancel()

Mantenha uma referência forte ao cancellable retornado. O SDK cancela a inscrição quando o cancellable é desalocado. O SDK invoca seu handler na thread principal.
// Register the subscription
val subscriber = IEventSubscriber<BannersEvent> { event ->
when (event) {
is BannersEvent.CacheReplay -> {
// Sent once, right away, with the cached data
}
is BannersEvent.DataUpdated -> {
// A refresh finished or the data changed locally
}
is BannersEvent.ErrorEvent -> {
// A request or analytics operation failed
}
else -> Unit
}
}
Braze.getInstance(context).subscribeToBannersEvents(subscriber)
// Remove the subscription when you no longer need it
Braze.getInstance(context).removeSingleSubscription(subscriber, BannersEvent::class.java)

O SDK invoca seu assinante em uma thread em segundo plano. Mude para a thread principal antes de atualizar sua UI.
Snapshots de cache
Eventos CACHE_REPLAY, CACHE_LOAD e DATA_UPDATED incluem uma propriedade cacheSnapshot com os dados que o SDK armazenou em cache para o usuário atual.
| Canal | Dados em cacheSnapshot |
|---|---|
| Banners | banners: um mapa de cada ID de posicionamento para seu Banner em cache. Posicionamentos sem um Banner não estão no mapa. |
| Content Cards | Web: contentCards, um objeto ContentCards. Use contentCards.cards para obter a lista de cartões. Swift e Android: cards, a lista de cartões. |
| Feature Flags | featureFlags: a lista de Feature Flags. |
Todo snapshot também inclui lastSyncAt, o horário da última sincronização bem-sucedida para o usuário atual como um timestamp Unix em segundos. O valor é 0 se nenhuma sincronização foi bem-sucedida e null (nil no Swift) se o canal estiver desativado.
Migrar das inscrições de atualização
Os métodos de inscrição de atualização ainda funcionam, mas estão descontinuados. Para migrar cada inscrição, depois de atender aos pré-requisitos:
- Substitua o método descontinuado pelo método de inscrição de eventos para aquele canal. As tabelas em Sobre inscrições de eventos listam cada par.
- Atualize seu retorno de chamada. O retorno de chamada antigo recebia apenas os dados atuais. O novo retorno de chamada recebe um evento, então verifique o tipo do evento. Para eventos
CACHE_REPLAY,CACHE_LOADeDATA_UPDATED, leia os dados decacheSnapshote renderize novamente. - (Opcional) Trate eventos
ERRORpara descobrir quando uma atualização ou uma operação de análise de dados falha. No Android, eles substituemsubscribeToBannersErrors. Para mais detalhes, consulte Motivos de erro. - Remova a inscrição. No Android, passe a nova classe de evento (
BannersEvent,ContentCardsEventouFeatureFlagsEvent) pararemoveSingleSubscription, e não a classe legada…UpdatedEvent.
Para exemplos de código antes e depois, consulte o guia de cada canal nas tabelas em Sobre inscrições de eventos.
Tipos de evento
Todo evento é um dos tipos de evento nesta tabela. Na Web, o evento tem uma propriedade type com um dos valores de ChannelEventType. No Swift e Android, cada tipo de evento é seu próprio case ou classe. Nem todo canal envia todos os tipos de evento.
| Tipo de evento | Enviado por | Quando é disparado | O que fazer |
|---|---|---|---|
CACHE_REPLAY |
Banners, Content Cards, Feature Flags | Uma vez, imediatamente, cada vez que você se inscreve. Possui um cacheSnapshot com o cache atual. |
Renderize os dados em cache para que sua UI tenha conteúdo sem esperar pela rede. |
CACHE_LOAD |
Banners, Content Cards, Feature Flags | O cache mudou sem uma atualização do servidor. Isso acontece quando o usuário muda, quando você limpa os dados do SDK ou quando o canal é desativado. Na Web, Content Cards também o envia quando cartões chegam do service worker. No Swift e Android, também é disparado quando o SDK carrega o cache do armazenamento local antes de qualquer sincronização de rede. Possui um cacheSnapshot com o novo cache. |
Renderize novamente a partir do snapshot. Após uma troca de usuário ou quando o canal é desativado, o snapshot pode estar vazio, então limpe o conteúdo do usuário anterior. |
DATA_UPDATED |
Banners, Content Cards, Feature Flags | O cache mudou. O SDK o envia para cada atualização concluída, mesmo que nada tenha mudado, e para alterações locais como uma dispensa. Possui um cacheSnapshot e um reason. |
Renderize novamente a partir do snapshot. Verifique reason para decidir se a mudança veio de uma atualização ou de uma ação sua. |
IMPRESSION |
Banners, Content Cards, Feature Flags | Uma impressão foi registrada. Possui uma action e o item que foi registrado (banner, card ou flag). |
Opcional. Use para espelhar impressões na sua própria análise de dados. |
CLICK |
Banners, Content Cards | Um clique foi registrado. Possui uma action e o item que foi clicado (banner ou card). Cliques em Banner também incluem um ID de botão se o clique veio de um botão com ID. |
Opcional. Use para espelhar cliques na sua própria análise de dados. |
DISMISS |
Banners, Content Cards | Uma dispensa foi registrada. Possui uma action e o item que foi dispensado (banner ou card). |
Opcional. DISMISS é o evento de análise de dados, então atualize sua UI a partir do evento DATA_UPDATED que segue uma dispensa. |
ERROR |
Banners, Content Cards, Feature Flags | Uma solicitação ou operação falhou. Possui um reason e um retryState. Na Web, às vezes possui rateLimitedUntil. No Swift e Android, o horário do limite de frequência faz parte do motivo RATE_LIMITED. |
Verifique retryState para decidir se deve tentar novamente e verifique reason para encontrar a causa. |
Motivos de atualização
Eventos DATA_UPDATED incluem um reason com um dos valores de ChannelUpdateReason.
| Valor | Significado | O que fazer |
|---|---|---|
AUTO_SERVER_REFRESH |
Uma atualização iniciada pelo SDK foi concluída, como uma atualização em uma nova sessão, incluindo suas novas tentativas. | Renderize novamente a partir do snapshot. |
MANUAL_SERVER_REFRESH |
Uma atualização que você solicitou foi concluída, incluindo suas novas tentativas. Exemplos são requestBannersRefresh(), requestContentCardsRefresh() e refreshFeatureFlags() na Web e Android, ou requestRefresh() no Swift. |
Renderize novamente a partir do snapshot. Use isto para esconder um indicador de carregamento que você exibiu ao solicitar a atualização. |
CLIENT_ACTION |
O cache mudou por causa de uma ação local em vez de uma resposta do servidor, como dispensar um Banner ou um Content Card. | Renderize novamente a partir do snapshot sem exibir um estado de carregamento ou erro. Feature Flags não envia este motivo atualmente, mas trate-o para que seu código continue funcionando caso isso mude. |
Estados de nova tentativa
Eventos ERROR incluem um retryState com um dos valores de RetryState. Ele indica se o SDK tentará novamente a operação que falhou e o que você deve fazer.
| Valor | Significado | O que fazer |
|---|---|---|
SDK_WILL_RETRY |
O SDK está tentando novamente automaticamente, ou está aguardando um limite de frequência ser liberado para então tentar novamente. | Continue exibindo o conteúdo em cache. Não solicite outra atualização, porque o SDK envia um evento DATA_UPDATED ou outro ERROR quando a nova tentativa é concluída. |
INTEGRATOR_MAY_RETRY |
O SDK parou de tentar novamente. | Continue exibindo o conteúdo em cache. Você pode chamar o método de atualização novamente após um intervalo. Se o evento incluir rateLimitedUntil, aguarde até esse horário. |
DO_NOT_RETRY |
A falha é final para esta operação. Tentar novamente não vai ajudar. | Não tente novamente. Corrija a causa, como a chave de API ou as configurações do espaço de trabalho. Se o motivo for FEATURE_DISABLED, pare de exibir conteúdo do canal. |

Atualizações não são tentadas novamente automaticamente após um erro de cliente (uma resposta HTTP 4xx diferente de 429). O SDK reporta esses erros com o estado de nova tentativa DO_NOT_RETRY. Ele ainda tenta novamente HTTP 429, HTTP 5xx e falhas de rede.
Ações de análise de dados
Eventos IMPRESSION, CLICK e DISMISS incluem uma action com um dos valores de AnalyticsAction. Cada evento de análise de dados é enviado duas vezes: primeiro com ENQUEUED, depois com FLUSHED.
| Valor | Significado | O que fazer |
|---|---|---|
ENQUEUED |
O SDK salvou o evento de análise de dados localmente. A Braze ainda não o recebeu. | Use para atualizar sua UI ou seu próprio registro imediatamente. |
FLUSHED |
O SDK enviou o evento de análise de dados para a Braze com uma resposta de rede bem-sucedida. | Use como confirmação de que o evento foi enviado. |
Motivos de erro
Eventos ERROR incluem um reason com um dos valores de ChannelErrorReason. Todo motivo pode se aplicar a qualquer canal.
| Valor | Significado | O que fazer |
|---|---|---|
SERVER_ERROR |
A Braze retornou uma falha do lado do servidor (como uma resposta HTTP 5xx ou uma resposta HTTP 429 sem um cabeçalho Retry-After utilizável), ou a solicitação não chegou à Braze. |
Siga o retryState. O SDK tenta novamente primeiro, depois reporta INTEGRATOR_MAY_RETRY. Continue exibindo o conteúdo em cache. |
CLIENT_ERROR |
A Braze rejeitou a solicitação (como uma resposta HTTP 4xx diferente de 429 ou um erro de autenticação do SDK). Na Web, para Feature Flags, também pode significar que o SDK não conseguiu salvar uma impressão localmente. | Siga o retryState. Uma resposta HTTP 4xx é DO_NOT_RETRY imediatamente. Para um erro de autenticação do SDK, o SDK tenta novamente primeiro e depois reporta DO_NOT_RETRY. Verifique sua chave de API, endpoint do SDK e configuração de autenticação do SDK. |
RATE_LIMITED |
A solicitação teve o limite de frequência atingido. O evento inclui rateLimitedUntil, uma data para o horário mais cedo em que outra tentativa pode ter sucesso. |
Se o retryState for SDK_WILL_RETRY, aguarde. Se for INTEGRATOR_MAY_RETRY, aguarde até rateLimitedUntil antes de atualizar novamente, pois uma solicitação anterior falhará novamente. Para saber mais, consulte Limites de frequência. |
SDK_DISABLED |
O SDK está desativado localmente, então não faz solicitações de rede. | Trate como final e não tente novamente. |
INVALID_SERVER_DATA |
A Braze retornou dados que o SDK não conseguiu interpretar. | Não tente novamente. O retryState é DO_NOT_RETRY. Continue exibindo o conteúdo em cache e entre em contato com o suporte da Braze se o problema persistir. |
FEATURE_DISABLED |
O canal está desativado para este espaço de trabalho. O SDK também reporta o canal como desativado até receber sua primeira configuração da Braze. | Oculte a UI do canal. Isso não é o mesmo que uma lista vazia de conteúdo. Mantenha sua inscrição: se a Braze então ativar o canal, o SDK atualiza e envia um evento DATA_UPDATED. |

Você pode receber um erro FEATURE_DISABLED ao se inscrever antes que o SDK tenha recebido sua primeira configuração da Braze, mesmo que o canal esteja ativado para seu espaço de trabalho. Mantenha sua inscrição ativa e trate o evento DATA_UPDATED que se segue.