Xử lý sự kiện onboarding trong React Native SDK Sao chép cho LLM Xem dưới dạng Markdown Onboarding đã bị deprecated trong SDK v4 và sẽ bị xóa trong phiên bản tương lai. Chúng không còn nhận được các bản sửa lỗi hay cải tiến nữa. Hãy sử dụng flows thay thế: không giống như onboarding chạy bên trong WebView, flow render trực tiếp trên thiết bị — mang lại hoạt ảnh mượt mà hơn, giao diện native nhất quán, thời gian tải nhanh hơn và không phụ thuộc vào WebView runtime. Xem Lấy flows & paywalls và Hiển thị flows & paywalls để bắt đầu.
Các onboarding được cấu hình bằng builder sẽ tạo ra các sự kiện mà ứng dụng của bạn có thể xử lý. Cách xử lý những sự kiện này phụ thuộc vào phương pháp hiển thị bạn đang dùng:
Trình bày dạng Modal : Yêu cầu thiết lập các event handler để xử lý sự kiện cho tất cả các onboarding view
React component : Xử lý sự kiện thông qua các tham số callback trực tiếp trong widget
Trước khi bắt đầu, hãy đảm bảo rằng:
Bạn đã cài đặt Adapty React Native SDK phiên bản 3.8.0 trở lên.
Bạn đã tạo một onboarding .
Bạn đã thêm onboarding vào một placement .
Để kiểm soát hoặc theo dõi các tiến trình xảy ra trên màn hình onboarding trong ứng dụng di động của bạn, hãy triển khai các event handler:
Đối với React component, bạn xử lý các sự kiện thông qua các prop xử lý sự kiện riêng lẻ trong component 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}
/>
);
} Đối với modal presentation, hãy triển khai phương thức event handlers.
Việc gọi setEventHandlers nhiều lần sẽ ghi đè các handler bạn đã cung cấp, thay thế cả handler mặc định lẫn các handler đã thiết lập trước đó cho những sự kiện cụ thể đó.
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
} Đối với SDK version < 3.14, chỉ hỗ trợ modal presentation:
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
}
Các loại sự kiện
Các phần dưới đây mô tả các loại sự kiện khác nhau mà bạn có thể xử lý, bất kể phương thức hiển thị bạn đang dùng là gì.
Xử lý custom action
Trong builder, bạn có thể thêm action custom cho một nút và gán cho nó một ID.
Sau đó, bạn có thể sử dụng ID này trong code và xử lý nó như một hành động tùy chỉnh. Ví dụ: nếu người dùng nhấn vào một nút tùy chỉnh như Login hay Allow notifications , event handler sẽ được kích hoạt với tham số actionId khớp với Action ID trong builder. Bạn có thể tự tạo ID theo ý muốn, chẳng hạn như “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 ;
}
},
});
Ví dụ sự kiện (Nhấn để mở rộng) {
"actionId" : "allow_notifications" ,
"meta" : {
"onboardingId" : "onboarding_123" ,
"screenClientId" : "profile_screen" ,
"screenIndex" : 0 ,
"screensTotal" : 3
}
}
Hoàn tất tải onboarding
Khi một onboarding hoàn tất tải, sự kiện này sẽ được kích hoạt:
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);
},
});
Ví dụ sự kiện (Nhấp để mở rộng) {
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "welcome_screen" ,
"screen_index" : 0 ,
"total_screens" : 4
}
}
Đóng onboarding
Onboarding được coi là đã đóng khi người dùng nhấn vào một nút có gán hành động Close .
Lưu ý rằng bạn cần tự xử lý những gì xảy ra khi người dùng đóng onboarding. Ví dụ, bạn cần dừng hiển thị chính 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 ;
},
});
Ví dụ sự kiện (Nhấn để mở rộng) {
"action_id" : "close_button" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "final_screen" ,
"screen_index" : 3 ,
"total_screens" : 4
}
}
Mở một paywall
Xử lý sự kiện này để mở paywall nếu bạn muốn mở nó bên trong onboarding. Nếu bạn muốn mở paywall sau khi nó đã đóng, có cách đơn giản hơn – xử lý hành động đóng và mở paywall mà không cần dựa vào dữ liệu sự kiện.
Cách liền mạch nhất để làm việc với paywall trong onboarding là đặt action ID bằng với placement ID của 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
}; Lưu ý rằng trên iOS, chỉ có thể hiển thị một view (paywall hoặc onboarding) trên màn hình tại một thời điểm. Nếu bạn hiển thị một paywall chồng lên onboarding, bạn không thể điều khiển onboarding ở phía sau theo cách lập trình. Việc cố đóng onboarding sẽ đóng paywall thay vào đó, khiến onboarding vẫn hiển thị. Để tránh điều này, hãy luôn đóng onboarding view trước khi hiển thị 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
}; Lưu ý rằng, trên iOS, chỉ có thể hiển thị một view (paywall hoặc onboarding) trên màn hình tại một thời điểm. Nếu bạn hiển thị một paywall chồng lên một onboarding, bạn không thể điều khiển onboarding ở phía sau theo cách lập trình. Việc cố gắng đóng onboarding sẽ đóng paywall thay vào đó, khiến onboarding vẫn còn hiển thị. Để tránh điều này, hãy luôn đóng view onboarding trước khi hiển thị 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
};
Ví dụ sự kiện (Nhấn để mở rộng) {
"action_id" : "premium_offer_1" ,
"meta" : {
"onboarding_id" : "onboarding_123" ,
"screen_cid" : "pricing_screen" ,
"screen_index" : 2 ,
"total_screens" : 4
}
}
Theo dõi điều hướng
Bạn nhận được một sự kiện analytics khi các sự kiện liên quan đến điều hướng xảy ra trong flow 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);
},
});
Đối tượng event có thể là một trong các kiểu sau:
Loại Mô tả onboardingStartedKhi onboarding đã được tải screenPresentedKhi bất kỳ màn hình nào được hiển thị screenCompletedKhi một màn hình hoàn tất. Bao gồm elementId tùy chọn (định danh của phần tử đã hoàn tất) và reply tùy chọn (phản hồi từ người dùng). Được kích hoạt khi người dùng thực hiện bất kỳ hành động nào để thoát khỏi màn hình. secondScreenPresentedKhi màn hình thứ hai được hiển thị userEmailCollectedĐược kích hoạt khi email của người dùng được thu thập qua trường nhập liệu onboardingCompletedĐược kích hoạt khi người dùng đến màn hình có ID final. Nếu bạn cần sự kiện này, hãy gán ID final cho màn hình cuối cùng . unknownDành cho bất kỳ loại sự kiện không được nhận dạng nào. Bao gồm name (tên của sự kiện không xác định) và meta (siêu dữ liệu bổ sung) Mỗi sự kiện bao gồm thông tin meta chứa:
Trường Mô tả onboardingIdMã định danh duy nhất của flow onboarding screenClientIdMã định danh của màn hình hiện tại screenIndexVị trí của màn hình hiện tại trong flow screensTotalTổng số màn hình trong flow
Ví dụ về sự kiện (Nhấn để mở rộng) // 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
}
}