Xử lý sự kiện onboarding trong Capacitor SDK
Onboarding đã bị deprecated trong SDK v4 và sẽ bị loại bỏ 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ác với onboarding chạy bên trong WebView, flows render trực tiếp trên thiết bị — mang lại animation 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ể phản hồi. Sử dụng phương thức setEventHandlers để xử lý các sự kiện này khi hiển thị màn hình độc lập.
Trước khi bắt đầu, hãy đảm bảo rằng:
- Bạn đã tạo một onboarding.
- Bạn đã thêm onboarding vào một placement.
Thiết lập trình xử lý sự kiện
Để xử lý các sự kiện cho onboarding, sử dụng phương thức view.setEventHandlers:
try {
const view = await createOnboardingView(onboarding);
view.setEventHandlers({
onAnalytics(event, meta) {
console.log('Analytics event:', event);
},
onClose(actionId, meta) {
console.log('Onboarding closed:', actionId);
return true; // Allow the onboarding to close
},
onCustom(actionId, meta) {
console.log('Custom action:', actionId);
return false; // Don't close the onboarding
},
onPaywall(actionId, meta) {
console.log('Paywall action:', actionId);
view.dismiss().then(() => {
openPaywall(actionId);
});
},
onStateUpdated(action, meta) {
console.log('State updated:', action);
},
onFinishedLoading(meta) {
console.log('Onboarding finished loading');
},
onError(error) {
console.error('Onboarding error:', error);
},
});
await view.present();
} catch (error) {
console.error('Failed to present onboarding:', 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ý.
Xử lý custom action
Trong builder, bạn có thể thêm action custom vào 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 hoặc Allow notifications, trình xử lý sự kiện 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”.
view.setEventHandlers({
onCustom(actionId, meta) {
switch (actionId) {
case 'login':
console.log('Login action triggered');
break;
case 'allow_notifications':
console.log('Allow notifications action triggered');
break;
}
return false; // Don't close the onboarding
},
});
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 onboarding hoàn tất việc tải, sự kiện này sẽ được kích hoạt:
view.setEventHandlers({
onFinishedLoading(meta) {
console.log('Onboarding loaded:', meta.onboardingId);
},
});
Ví dụ sự kiện (Nhấn để 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 nút có hành động Close được gán.
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 việc hiển thị onboarding đó.
view.setEventHandlers({
onClose(actionId, meta) {
console.log('Onboarding closed:', actionId);
return true; // Allow the onboarding to close
},
});
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ở 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 lại, có một 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 các paywall trong onboarding là đặt action ID bằng với placement ID của paywall. Lưu ý rằng, đối với 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 trên một onboarding, bạn không thể điều khiển onboarding ở nền 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 hiển thị. Để tránh điều này, hãy luôn đóng view onboarding trước khi hiển thị paywall.
view.setEventHandlers({
onPaywall(actionId, meta) {
// Dismiss onboarding before presenting paywall
view.dismiss().then(() => {
openPaywall(actionId);
});
},
});
async function openPaywall(placementId: string) {
// 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 sự kiện analytics khi các sự kiện liên quan đến điều hướng xảy ra trong flow onboarding:
view.setEventHandlers({
onAnalytics(event, meta) {
console.log('Analytics event:', event.type, meta.onboardingId);
},
});
Object event có thể là một trong các kiểu sau:
| Loại | Mô tả |
|---|---|
onboardingStarted | Khi onboarding đã được tải |
screenPresented | Khi bất kỳ màn hình nào được hiển thị |
screenCompleted | Khi một màn hình hoàn thành. Bao gồm elementId tùy chọn (định danh của phần tử đã hoàn thành) 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. |
secondScreenPresented | Khi 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. |
unknown | Dà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 đều bao gồm thông tin meta chứa: |
| Trường | Mô tả |
|---|---|
onboardingId | Mã định danh duy nhất của onboarding flow |
screenClientId | Mã định danh của màn hình hiện tại |
screenIndex | Vị trí của màn hình hiện tại trong flow |
screensTotal | Tổ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
}
}