Gestionar eventos de onboarding en el SDK de React Native Copiar para LLM Ver como Markdown Los onboardings configurados con el builder generan eventos a los que tu app puede responder. La forma de gestionar estos eventos depende del enfoque de presentación que estés usando:
Presentación modal : Requiere configurar manejadores de eventos que gestionen los eventos de todas las vistas de onboarding
Componente React : Gestiona los eventos mediante parámetros de callback directamente en el widget
Antes de empezar, asegúrate de que:
Has instalado el SDK de Adapty para React Native 3.8.0 o posterior.
Has creado un onboarding .
Has añadido el onboarding a un placement .
Para controlar o monitorizar los procesos que ocurren en la pantalla de onboarding dentro de tu app, implementa los manejadores de eventos:
Para el componente React, los eventos se gestionan mediante props individuales de manejadores de eventos en el componente AdaptyOnboardingView:
function MyOnboarding ({ onboarding }) {
const onAnalytics = useCallback < OnboardingEventHandlers [ 'onAnalytics' ]>(( event , meta ) => {}, []);
const onClose = useCallback < OnboardingEventHandlers [ 'onClose' ]>(( actionId , meta ) => {}, []);
const onCustom = useCallback < OnboardingEventHandlers [ 'onCustom' ]>(( actionId , meta ) => {}, []);
const onPaywall = useCallback < OnboardingEventHandlers [ 'onPaywall' ]>(( actionId , meta ) => {}, []);
const onStateUpdated = useCallback < OnboardingEventHandlers [ 'onStateUpdated' ]>(( action , meta ) => {}, []);
const onFinishedLoading = useCallback < OnboardingEventHandlers [ 'onFinishedLoading' ]>(( meta ) => {}, []);
const onError = useCallback < OnboardingEventHandlers [ 'onError' ]>(( error ) => {}, []);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onAnalytics = {onAnalytics}
onClose = {onClose}
onCustom = {onCustom}
onPaywall = {onPaywall}
onStateUpdated = {onStateUpdated}
onFinishedLoading = {onFinishedLoading}
onError = {onError}
/>
);
} Para la presentación modal, implementa el método de controladores de eventos.
Llamar a setEventHandlers varias veces sobreescribirá los controladores que proporciones, reemplazando tanto los predeterminados como los configurados previamente para esos eventos específicos.
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onAnalytics ( event , meta ) {
// Track analytics events
},
onClose ( actionId , meta ) {
// Handle close action
view. dismiss ();
return true ;
},
onCustom ( actionId , meta ) {
// Handle custom actions
},
onPaywall ( actionId , meta ) {
// Handle paywall actions
},
onStateUpdated ( action , meta ) {
// Handle user input updates
},
onFinishedLoading ( meta ) {
// Onboarding finished loading
},
onError ( error ) {
// Handle loading errors
},
});
try {
await view. present ();
} catch (error) {
// handle the error
} Para la versión del SDK < 3.14, solo se admite la presentación modal:
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onAnalytics ( event , meta ) {
// Track analytics events
},
onClose ( actionId , meta ) {
// Handle close action
view. dismiss ();
return true ;
},
onCustom ( actionId , meta ) {
// Handle custom actions
},
onPaywall ( actionId , meta ) {
// Handle paywall actions
},
onStateUpdated ( action , meta ) {
// Handle user input updates
},
onFinishedLoading ( meta ) {
// Onboarding finished loading
},
onError ( error ) {
// Handle loading errors
},
});
try {
await view. present ();
} catch (error) {
// handle the error
}
Tipos de eventos
Las siguientes secciones describen los distintos tipos de eventos que puedes manejar, independientemente del enfoque de presentación que estés usando.
Gestionar acciones personalizadas
En el builder, puedes añadir una acción custom a un botón y asignarle un ID.
Luego, puedes usar este ID en tu código y gestionarlo como una acción personalizada. Por ejemplo, si el usuario pulsa un botón personalizado, como Login o Allow notifications , el manejador de eventos se activará con el parámetro actionId que coincide con el Action ID del builder. Puedes crear tus propios IDs, como “allowNotifications”.
function MyOnboarding ({ onboarding }) {
const onCustom = useCallback < OnboardingEventHandlers [ 'onCustom' ]>(( actionId , meta ) => {
switch (actionId) {
case 'login' :
login ();
break ;
case 'allow_notifications' :
allowNotifications ();
break ;
}
}, []);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onCustom = {onCustom}
/>
);
}
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onCustom ( actionId , meta ) {
switch (actionId) {
case 'login' :
login ();
break ;
case 'allow_notifications' :
allowNotifications ();
break ;
}
},
});
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onCustom ( actionId , meta ) {
switch (actionId) {
case 'login' :
login ();
break ;
case 'allow_notifications' :
allowNotifications ();
break ;
}
},
});
Ejemplo de evento (haz clic para expandir) {
"actionId" : "allow_notifications" ,
"meta" : {
"onboardingId" : "onboarding_123" ,
"screenClientId" : "profile_screen" ,
"screenIndex" : 0 ,
"screensTotal" : 3
}
}
Finalizar la carga del onboarding
Cuando un onboarding termina de cargarse, se dispara este evento:
function MyOnboarding ({ onboarding }) {
const onFinishedLoading = useCallback < OnboardingEventHandlers [ 'onFinishedLoading' ]>(( meta ) => {
console. log ( 'Onboarding loaded:' , meta.onboardingId);
}, []);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onFinishedLoading = {onFinishedLoading}
/>
);
}
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onFinishedLoading ( meta ) {
console. log ( 'Onboarding loaded:' , meta.onboardingId);
},
});
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onFinishedLoading ( meta ) {
console. log ( 'Onboarding loaded:' , meta.onboardingId);
},
});
Ejemplo de evento (haz clic para expandir) {
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "welcome_screen" ,
"screen_index" : 0 ,
"total_screens" : 4
}
}
Cerrar el onboarding
El onboarding se considera cerrado cuando el usuario pulsa un botón con la acción Close asignada.
Ten en cuenta que debes gestionar qué ocurre cuando el usuario cierra el onboarding. Por ejemplo, debes dejar de mostrar el propio onboarding.
function MyOnboarding ({ onboarding , navigation }) {
const onClose = useCallback < OnboardingEventHandlers [ 'onClose' ]>(( actionId , meta ) => {
navigation. goBack ();
}, [navigation]);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onClose = {onClose}
/>
);
}
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onClose ( actionId , meta ) {
await view. dismiss ();
return true ;
},
});
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onClose ( actionId , meta ) {
await view. dismiss ();
return true ;
},
});
Ejemplo de evento (haz clic para expandir) {
"action_id" : "close_button" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "final_screen" ,
"screen_index" : 3 ,
"total_screens" : 4
}
}
Abrir un paywall
Maneja este evento para abrir un paywall si quieres abrirlo dentro del onboarding. Si quieres abrir un paywall después de cerrarlo, hay una forma más directa de hacerlo: maneja la acción de cierre y abre el paywall sin depender de los datos del evento.
La manera más sencilla de trabajar con paywalls en onboardings es hacer que el ID de la acción sea igual al ID del placement del paywall.
function MyOnboarding ({ onboarding }) {
const onPaywall = useCallback < OnboardingEventHandlers [ 'onPaywall' ]>(( actionId , meta ) => {
openPaywall (actionId);
}, []);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onPaywall = {onPaywall}
/>
);
}
const openPaywall = async ( placementId ) => {
// Implement your paywall opening logic here
}; Ten en cuenta que, en iOS, solo se puede mostrar una vista (paywall u onboarding) en pantalla a la vez. Si presentas un paywall encima de un onboarding, no podrás controlar programáticamente el onboarding en segundo plano. Si intentas cerrar el onboarding, se cerrará el paywall en su lugar, dejando el onboarding visible. Para evitarlo, cierra siempre la vista del onboarding antes de presentar el paywall.
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onPaywall ( actionId , meta ) {
view. dismiss (). then (() => {
openPaywall (actionId);
});
},
});
const openPaywall = async ( placementId ) => {
// Implement your paywall opening logic here
}; Ten en cuenta que, en iOS, solo se puede mostrar una vista (paywall u onboarding) en pantalla a la vez. Si presentas un paywall encima de un onboarding, no podrás controlar el onboarding que queda en segundo plano de forma programática. Si intentas cerrar el onboarding, se cerrará el paywall en su lugar, dejando el onboarding visible. Para evitar esto, cierra siempre la vista del onboarding antes de presentar el paywall.
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onPaywall ( actionId , meta ) {
view. dismiss (). then (() => {
openPaywall (actionId);
});
},
});
const openPaywall = async ( placementId ) => {
// Implement your paywall opening logic here
};
Ejemplo de evento (Haz clic para expandir) {
"action_id" : "premium_offer_1" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "pricing_screen" ,
"screen_index" : 2 ,
"total_screens" : 4
}
}
Seguimiento de la navegación
Recibirás un evento de análisis cuando se produzcan distintos eventos relacionados con la navegación durante el flow de onboarding:
function MyOnboarding ({ onboarding }) {
const onAnalytics = useCallback < OnboardingEventHandlers [ 'onAnalytics' ]>(( event , meta ) => {
trackEvent (event.name, meta.onboardingId);
}, []);
return (
< AdaptyOnboardingView
onboarding = {onboarding}
style = {styles.container}
onAnalytics = {onAnalytics}
/>
);
}
const view = await createOnboardingView (onboarding);
const unsubscribe = view. setEventHandlers ({
onAnalytics ( event , meta ) {
trackEvent (event.name, meta.onboardingId);
},
});
const view = await createOnboardingView (onboarding);
const unsubscribe = view. registerEventHandlers ({
onAnalytics ( event , meta ) {
trackEvent (event.name, meta.onboardingId);
},
});
El objeto event puede ser uno de los siguientes tipos:
Tipo Descripción onboardingStartedCuando el onboarding se ha cargado screenPresentedCuando se muestra cualquier pantalla screenCompletedCuando se completa una pantalla. Incluye un elementId opcional (identificador del elemento completado) y un reply opcional (respuesta del usuario). Se activa cuando el usuario realiza cualquier acción para salir de la pantalla. secondScreenPresentedCuando se muestra la segunda pantalla userEmailCollectedSe activa cuando se recoge el email del usuario mediante el campo de entrada onboardingCompletedSe activa cuando un usuario llega a una pantalla con el ID final. Si necesitas este evento, asigna el ID final a la última pantalla . unknownPara cualquier tipo de evento no reconocido. Incluye name (el nombre del evento desconocido) y meta (metadatos adicionales) Cada evento incluye información meta con los siguientes campos:
Campo Descripción onboardingIdIdentificador único del flow de onboarding screenClientIdIdentificador de la pantalla actual screenIndexPosición de la pantalla actual en el flow screensTotalNúmero total de pantallas en el flow
Ejemplos de eventos (haz clic para expandir) // onboardingStarted
{
"name" : "onboarding_started" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "welcome_screen" ,
"screen_index" : 0 ,
"total_screens" : 4
}
}
// screenPresented
{
"name" : "screen_presented" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "interests_screen" ,
"screen_index" : 2 ,
"total_screens" : 4
}
}
// screenCompleted
{
"name" : "screen_completed" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "profile_screen" ,
"screen_index" : 1 ,
"total_screens" : 4
},
"params" : {
"element_id" : "profile_form" ,
"reply" : "success"
}
}
// secondScreenPresented
{
"name" : "second_screen_presented" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "profile_screen" ,
"screen_index" : 1 ,
"total_screens" : 4
}
}
// userEmailCollected
{
"name" : "user_email_collected" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "profile_screen" ,
"screen_index" : 1 ,
"total_screens" : 4
}
}
// onboardingCompleted
{
"name" : "onboarding_completed" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "final_screen" ,
"screen_index" : 3 ,
"total_screens" : 4
}
}