Ir al contenido

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
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.

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.

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:

  1. Cuando te suscribes: el SDK invoca tu devolución de llamada de inmediato con un evento CACHE_REPLAY que contiene los datos en caché. Si el canal está deshabilitado, envía un evento ERROR con el motivo FEATURE_DISABLED en su lugar. En ambos casos, tu suscripción permanece activa.
  2. Cuando la caché cambia: el SDK envía un evento CACHE_LOAD si la caché cambió sin una actualización del servidor, o un evento DATA_UPDATED si finalizó una actualización o modificaste los datos localmente.
  3. Cuando tú o el SDK registran análisis: el SDK envía un evento IMPRESSION, CLICK o DISMISS con la acción ENQUEUED, y lo envía de nuevo con la acción FLUSHED después de que Braze lo acepte.
  4. 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);
// 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()
// 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)

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:

  1. 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.
  2. 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_LOAD y DATA_UPDATED, lee los datos de cacheSnapshot y vuelve a renderizar.
  3. (Opcional) Gestiona los eventos ERROR para saber cuándo falla una actualización o una operación de análisis. En Android, reemplazan a subscribeToBannersErrors. Para más detalles, consulta Motivos de error.
  4. Elimina la suscripción. En Android, pasa la nueva clase de evento (BannersEvent, ContentCardsEvent o FeatureFlagsEvent) a removeSingleSubscription, 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.

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.
New Stuff!