Suscripciones a eventos
Aprende cómo funcionan las suscripciones a eventos del SDK de Braze para Banners, Content Cards y conmutadores de características. Este artículo explica cuándo se activa cada evento y qué debe hacer tu integración al respecto.
Requisitos previos
Estas son las versiones mínimas del SDK necesarias para usar las suscripciones a eventos:
Acerca de las suscripciones a eventos
Cada canal tiene un método de suscripción a eventos. Registras una devolución de llamada y el SDK la invoca cada vez que algo ocurre en ese canal, como una reproducción de caché, una actualización completada, un evento de análisis o un error. Cada evento te indica qué tipo de evento recibiste.
Los métodos de suscripción a eventos reemplazan a los métodos anteriores de suscripción a actualizaciones. Los métodos anteriores entregan solo los datos actuales. Los métodos de eventos también te indican por qué cambiaron los datos, cuándo se registran y envían los eventos de análisis, y cuándo falla una solicitud.
| Canal | Método de suscripción a eventos | Reemplaza a | Guía |
|---|---|---|---|
| Banners | subscribeToBannersEvents |
subscribeToBannersUpdates |
Gestionar ubicaciones de Banner |
| Content Cards | subscribeToContentCardsEvents |
subscribeToContentCardsUpdates |
Crear Content Cards |
| Conmutadores de características | subscribeToFeatureFlagsEvents |
subscribeToFeatureFlagsUpdates |
Crear conmutadores de características |

subscribeToBannersUpdates, subscribeToContentCardsUpdates y subscribeToFeatureFlagsUpdates están obsoletos y se eliminarán en una futura versión principal. Usa en su lugar el método de suscripción a eventos correspondiente.
| Canal | Método de suscripción a eventos | Reemplaza a | Guía |
|---|---|---|---|
| Banners | braze.banners.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Gestionar ubicaciones de Banner |
| Content Cards | braze.contentCards.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Crear Content Cards |
| Conmutadores de características | braze.featureFlags.subscribeToEvents(_:) |
subscribeToUpdates(_:) |
Crear conmutadores de características |
Para consultar la referencia completa de la API, visita la documentación de BrazeKit.
Cada canal también tiene una propiedad eventsStream que entrega los mismos eventos como un AsyncStream. Las aplicaciones Objective-C usan el método subscribeToEvents: en los mismos objetos de canal.

El método anterior subscribeToUpdates(_:) y los flujos de actualización por canal, como bannersStream, están obsoletos. Usa subscribeToEvents(_:) o eventsStream en su lugar.
| Canal | Método de suscripción a eventos | Clase de evento | Reemplaza a | Guía |
|---|---|---|---|---|
| Banners | subscribeToBannersEvents |
BannersEvent |
subscribeToBannersUpdates |
Gestionar ubicaciones de Banner |
| Content Cards | subscribeToContentCardsEvents |
ContentCardsEvent |
subscribeToContentCardsUpdates |
Crear Content Cards |
| Conmutadores de características | subscribeToFeatureFlagsEvents |
FeatureFlagsEvent |
subscribeToFeatureFlagsUpdates |
Crear conmutadores de características |
Para consultar la referencia completa de la API, visita el KDoc del SDK de Braze para Android.

subscribeToBannersUpdates, subscribeToContentCardsUpdates, subscribeToFeatureFlagsUpdates y subscribeToBannersErrors están obsoletos. Usa en su lugar el método de suscripción a eventos correspondiente.
Nombres por plataforma
Este artículo usa los nombres de Web para los tipos de eventos, motivos de actualización, estados de reintento, acciones de análisis y motivos de error. Swift y Android usan los mismos conceptos con nombres que siguen las convenciones 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 |
Los demás motivos de actualización, estados de reintento, acciones de análisis y motivos de error siguen el mismo patrón. En Swift, el tipo de motivo de actualización es Braze.ChannelUpdateReason. En Android, cada canal tiene su propio tipo de motivo de actualización, como BannersUpdateReason.
Cómo se entregan los eventos
El SDK entrega los eventos en este orden:
- Cuando te suscribes: el SDK invoca tu devolución de llamada de inmediato con un evento
CACHE_REPLAYque contiene los datos en caché. Si el canal está deshabilitado, envía un eventoERRORcon el motivoFEATURE_DISABLEDen su lugar. En ambos casos, tu suscripción permanece activa. - Cuando la caché cambia: el SDK envía un evento
CACHE_LOADsi la caché cambió sin una actualización del servidor, o un eventoDATA_UPDATEDsi finalizó una actualización o modificaste los datos localmente. - Cuando tú o el SDK registran análisis: el SDK envía un evento
IMPRESSION,CLICKoDISMISScon la acciónENQUEUED, y lo envía de nuevo con la acciónFLUSHEDdespués de que Braze lo acepte. - Cuando algo falla: el SDK envía un evento
ERROR.
Tu devolución de llamada recibe el evento como su único argumento. Gestiona cada tipo de evento con un switch sobre el tipo de evento. En Web, el SDK registra un error que tu devolución de llamada lance y aún así entrega el evento a los demás suscriptores.
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);

Invoca el método de suscripción a eventos después de inicializar el SDK. Invócalo antes de openSession() para que tu devolución de llamada reciba los eventos de la primera sesión. Si el SDK está deshabilitado, el método devuelve 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()

Mantén una referencia fuerte al cancelable devuelto. El SDK cancela la suscripción cuando el cancelable es liberado de la memoria. El SDK invoca tu controlador en el hilo 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)

El SDK invoca a tu suscriptor desde un hilo en segundo plano. Cambia al hilo principal antes de actualizar tu interfaz de usuario.
Instantáneas de caché
Los eventos CACHE_REPLAY, CACHE_LOAD y DATA_UPDATED incluyen una propiedad cacheSnapshot con los datos que el SDK tiene en caché para el usuario actual.
| Canal | Datos en cacheSnapshot |
|---|---|
| Banners | banners: un mapa de cada ID de ubicación a su Banner en caché. Las ubicaciones sin Banner no están en el mapa. |
| Content Cards | Web: contentCards, un objeto ContentCards. Usa contentCards.cards para obtener la lista de tarjetas. Swift y Android: cards, la lista de tarjetas. |
| Conmutadores de características | featureFlags: la lista de conmutadores de características. |
Cada instantánea también incluye lastSyncAt, la hora de la última sincronización exitosa para el usuario actual como un timestamp Unix en segundos. El valor es 0 si no ha habido una sincronización exitosa y null (nil en Swift) si el canal está deshabilitado.
Migrar desde suscripciones a actualizaciones
Los métodos de suscripción a actualizaciones aún funcionan, pero están obsoletos. Para migrar cada suscripción, después de cumplir los requisitos previos:
- Reemplaza el método obsoleto con el método de suscripción a eventos para ese canal. Las tablas en Acerca de las suscripciones a eventos listan cada par.
- Actualiza tu devolución de llamada. La devolución de llamada anterior recibía solo los datos actuales. La nueva devolución de llamada recibe un evento, así que comprueba el tipo de evento. Para los eventos
CACHE_REPLAY,CACHE_LOADyDATA_UPDATED, lee los datos decacheSnapshoty vuelve a renderizar. - (Opcional) Gestiona los eventos
ERRORpara saber cuándo falla una actualización o una operación de análisis. En Android, reemplazan asubscribeToBannersErrors. Para más detalles, consulta Motivos de error. - Elimina la suscripción. En Android, pasa la nueva clase de evento (
BannersEvent,ContentCardsEventoFeatureFlagsEvent) aremoveSingleSubscription, no la clase heredada…UpdatedEvent.
Para ver código de antes y después, consulta la guía de cada canal en las tablas de Acerca de las suscripciones a eventos.
Tipos de eventos
Cada evento es uno de los tipos de eventos de esta tabla. En Web, el evento tiene una propiedad type con uno de los valores ChannelEventType. En Swift y Android, cada tipo de evento es su propio case o clase. No todos los canales envían todos los tipos de eventos.
| Tipo de evento | Enviado por | Cuándo se activa | Qué hacer |
|---|---|---|---|
CACHE_REPLAY |
Banners, Content Cards, conmutadores de características | Una vez, de inmediato, cada vez que te suscribes. Tiene un cacheSnapshot con la caché actual. |
Renderiza los datos en caché para que tu interfaz de usuario tenga contenido sin esperar la red. |
CACHE_LOAD |
Banners, Content Cards, conmutadores de características | La caché cambió sin una actualización del servidor. Esto ocurre cuando el usuario cambia, cuando borras los datos del SDK o cuando el canal se desactiva. En Web, Content Cards también lo envía cuando las tarjetas llegan desde el prestador de servicios. En Swift y Android, también se activa cuando el SDK carga la caché desde el almacenamiento local antes de cualquier sincronización de red. Tiene un cacheSnapshot con la nueva caché. |
Vuelve a renderizar desde la instantánea. Después de un cambio de usuario o cuando el canal se desactiva, la instantánea puede estar vacía, así que limpia el contenido del usuario anterior. |
DATA_UPDATED |
Banners, Content Cards, conmutadores de características | La caché cambió. El SDK lo envía para cada actualización completada, incluso si nada cambió, y para cambios locales como un descarte. Tiene un cacheSnapshot y un reason. |
Vuelve a renderizar desde la instantánea. Verifica reason para decidir si el cambio provino de una actualización o de tu propia acción. |
IMPRESSION |
Banners, Content Cards, conmutadores de características | Se registró una impresión. Tiene una action y el elemento que fue registrado (banner, card o flag). |
Opcional. Úsalo para reflejar impresiones en tus propios análisis. |
CLICK |
Banners, Content Cards | Se registró un clic. Tiene una action y el elemento en el que se hizo clic (banner o card). Los clics de Banner también incluyen un ID de botón si el clic provino de un botón con ID. |
Opcional. Úsalo para reflejar clics en tus propios análisis. |
DISMISS |
Banners, Content Cards | Se registró un descarte. Tiene una action y el elemento que fue descartado (banner o card). |
Opcional. DISMISS es el evento de análisis, así que actualiza tu interfaz de usuario desde el evento DATA_UPDATED que sigue a un descarte. |
ERROR |
Banners, Content Cards, conmutadores de características | Una solicitud u operación falló. Tiene un reason y un retryState. En Web, a veces tiene rateLimitedUntil. En Swift y Android, el tiempo de límite de velocidad forma parte del motivo RATE_LIMITED. |
Verifica retryState para decidir si reintentar, y verifica reason para encontrar la causa. |
Motivos de actualización
Los eventos DATA_UPDATED incluyen un reason con uno de los valores ChannelUpdateReason.
| Valor | Significado | Qué hacer |
|---|---|---|
AUTO_SERVER_REFRESH |
Finalizó una actualización que el SDK inició, como una actualización en una nueva sesión, incluyendo sus reintentos. | Vuelve a renderizar desde la instantánea. |
MANUAL_SERVER_REFRESH |
Finalizó una actualización que tú solicitaste, incluyendo sus reintentos. Ejemplos son requestBannersRefresh(), requestContentCardsRefresh() y refreshFeatureFlags() en Web y Android, o requestRefresh() en Swift. |
Vuelve a renderizar desde la instantánea. Usa esto para ocultar un indicador de carga que mostraste cuando solicitaste la actualización. |
CLIENT_ACTION |
La caché cambió debido a una acción local en lugar de una respuesta del servidor, como descartar un Banner o una Content Card. | Vuelve a renderizar desde la instantánea sin mostrar un estado de carga o error. Los conmutadores de características no envían actualmente este motivo, pero gestiona este caso para que tu código siga funcionando si lo hacen. |
Estados de reintento
Los eventos ERROR incluyen un retryState con uno de los valores RetryState. Te indica si el SDK reintentará la operación fallida y qué debes hacer.
| Valor | Significado | Qué hacer |
|---|---|---|
SDK_WILL_RETRY |
El SDK está reintentando automáticamente o está esperando a que se libere un límite de velocidad para luego reintentar. | Sigue mostrando el contenido en caché. No solicites otra actualización, porque el SDK envía un evento DATA_UPDATED u otro evento ERROR cuando el reintento finalice. |
INTEGRATOR_MAY_RETRY |
El SDK ha dejado de reintentar. | Sigue mostrando el contenido en caché. Puedes invocar el método de actualización de nuevo después de una pausa. Si el evento incluye rateLimitedUntil, espera hasta ese momento. |
DO_NOT_RETRY |
El fallo es definitivo para esta operación. Reintentar no servirá. | No reintentes. Corrige la causa en su lugar, como la clave de API o la configuración del espacio de trabajo. Si el motivo es FEATURE_DISABLED, deja de mostrar contenido del canal. |

Las actualizaciones no se reintentan automáticamente después de un error del cliente (una respuesta HTTP 4xx diferente a 429). El SDK reporta estos errores con el estado de reintento DO_NOT_RETRY. Aún así reintenta las respuestas HTTP 429, HTTP 5xx y los fallos de red.
Acciones de análisis
Los eventos IMPRESSION, CLICK y DISMISS incluyen una action con uno de los valores AnalyticsAction. Cada evento de análisis se envía dos veces: primero con ENQUEUED, luego con FLUSHED.
| Valor | Significado | Qué hacer |
|---|---|---|
ENQUEUED |
El SDK guardó el evento de análisis localmente. Braze aún no lo ha recibido. | Úsalo para actualizar tu interfaz de usuario o tu propio registro de inmediato. |
FLUSHED |
El SDK envió el evento de análisis a Braze con una respuesta de red exitosa. | Úsalo como confirmación de que el evento fue enviado. |
Motivos de error
Los eventos ERROR incluyen un reason con uno de los valores ChannelErrorReason. Cada motivo puede aplicarse a cualquier canal.
| Valor | Significado | Qué hacer |
|---|---|---|
SERVER_ERROR |
Braze devolvió un fallo del lado del servidor (como una respuesta HTTP 5xx, o una respuesta HTTP 429 sin un encabezado Retry-After utilizable), o la solicitud no llegó a Braze. |
Sigue el retryState. El SDK reintenta primero y luego reporta INTEGRATOR_MAY_RETRY. Sigue mostrando el contenido en caché. |
CLIENT_ERROR |
Braze rechazó la solicitud (como una respuesta HTTP 4xx diferente a 429, o un error de autenticación del SDK). En Web, para los conmutadores de características, también puede significar que el SDK no pudo guardar una impresión localmente. | Sigue el retryState. Una respuesta HTTP 4xx es DO_NOT_RETRY de inmediato. Para un error de autenticación del SDK, el SDK reintenta primero y luego reporta DO_NOT_RETRY. Verifica tu clave de API, endpoint del SDK y la configuración de autenticación del SDK. |
RATE_LIMITED |
La solicitud fue limitada por velocidad. El evento incluye rateLimitedUntil, una fecha con el momento más temprano en que otro intento puede tener éxito. |
Si el retryState es SDK_WILL_RETRY, espera. Si es INTEGRATOR_MAY_RETRY, espera hasta rateLimitedUntil antes de actualizar de nuevo, porque una solicitud anterior fallaría otra vez. Para más información, consulta Límites de velocidad. |
SDK_DISABLED |
El SDK está deshabilitado localmente, por lo que no realiza solicitudes de red. | Trátalo como definitivo y no reintentes. |
INVALID_SERVER_DATA |
Braze devolvió datos que el SDK no pudo interpretar. | No reintentes. El retryState es DO_NOT_RETRY. Sigue mostrando el contenido en caché y contacta con soporte de Braze si persiste. |
FEATURE_DISABLED |
El canal está deshabilitado para este espacio de trabajo. El SDK también reporta el canal como deshabilitado hasta que recibe su primera configuración de Braze. | Oculta la interfaz de usuario del canal. Esto no es lo mismo que una lista de contenido vacía. Mantén tu suscripción: si Braze habilita el canal después, el SDK actualiza y envía un evento DATA_UPDATED. |

Puedes recibir un error FEATURE_DISABLED cuando te suscribes antes de que el SDK haya recibido su primera configuración de Braze, incluso si el canal está habilitado para tu espacio de trabajo. Mantén tu suscripción activa y gestiona el evento DATA_UPDATED que le sigue.