展示流程与付费墙 - Capacitor
如果你在付费墙编辑工具中创建了流程或付费墙,无需在移动端代码中手动渲染,即可将其展示给用户。这样的流程已包含展示内容和展示方式的完整配置。
在开始之前,请确保:
- 你已创建流程或付费墙。
- 你已将其添加到版位。
- 你已获取流程并准备好视图。
本指南仅适用于流程和付费墙编辑工具付费墙,需要 SDK v4.0 或更高版本。呈现流程的方式与远程配置付费墙有所不同。
- 如需呈现远程配置付费墙,请参阅渲染远程配置设计的付费墙。
要将流程或付费墙显示为独立屏幕,请在由 createFlowView 方法创建的 view 上调用 view.present() 方法。每个 view 只能使用一次。如果需要再次显示流程,请再次调用 createFlowView 以创建新的 view 实例。
禁止在未重新创建的情况下复用同一个 view,否则将导致错误。
const view = await createFlowView(flow);
// Optional: handle flow events (close, purchase, restore, etc)
// await view.setEventHandlers({ ... });
try {
await view.present();
} catch (error) {
// handle the error
}多次调用 setEventHandlers 会覆盖你设置的处理器,替换掉对应事件之前设置的默认处理器和自定义处理器。
配置 iOS 展示样式
通过向 present() 方法传递 iosPresentationStyle 参数,可以配置流程在 iOS 上的展示方式。该参数接受 'full_screen'(默认值)或 'page_sheet' 两个值。在 Android 上,流程始终以全屏 Activity 的形式展示。
try {
await view.present({ iosPresentationStyle: 'page_sheet' });
} catch (error) {
// handle the error
}使用开发者自定义计时器
要在移动应用中使用开发者自定义计时器,请使用 timerId,在本例中为 CUSTOM_TIMER_NY,即你在 Adapty 看板中设置的开发者自定义计时器的 Timer ID。这可确保你的应用动态更新计时器,显示正确的值——例如 13d 09h 03m 34s(计算方式为计时器的结束时间(如元旦)减去当前时间)。
const customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) };
const view = await createFlowView(flow, { customTimers });在此示例中,CUSTOM_TIMER_NY 是你在 Adapty 看板中设置的开发者自定义计时器的计时器 ID。计时器会确保你的应用动态更新并显示正确的倒计时值——例如 13d 09h 03m 34s(由计时器的结束时间(如元旦)减去当前时间计算得出)。
显示对话框
当 Android 上展示 flow 视图时,请使用此方法代替原生的 alert 对话框。在 Android 上,普通 alert 会出现在 flow 视图的后面,导致用户无法看到。此方法可确保在所有平台上,对话框都能正确显示在 flow 的上层。
try {
const action = await view.showDialog({
title: 'Close paywall?',
content: 'You will lose access to exclusive offers.',
primaryActionTitle: 'Stay',
secondaryActionTitle: 'Close',
});
if (action === 'secondary') {
// User confirmed - close the flow
await view.dismiss();
}
// If primary - do nothing, user stays
} catch (error) {
// handle error
}用新订阅替换旧订阅
当 Android 用户在已有活跃订阅的情况下尝试购买新订阅时,你可以在创建流程视图时传入订阅更新参数,来控制新购买的处理方式。如需用新订阅替换当前订阅,请在 createFlowView 中使用 productPurchaseParams,并传入 oldSubVendorProductId 和 prorationMode 参数。
const productPurchaseParams = flow.paywalls
.flatMap((paywall) => paywall.productIdentifiers)
.map((productId) => {
const params: MakePurchaseParamsInput = {};
if (Capacitor.getPlatform() === 'android') {
params.android = {
subscriptionUpdateParams: {
oldSubVendorProductId: 'PRODUCT_ID_OF_THE_CURRENT_ACTIVE_SUBSCRIPTION',
prorationMode: 'with_time_proration',
},
};
}
return { productId, params };
});
const view = await createFlowView(flow, { productPurchaseParams });如果你已经使用付费墙编辑工具自定义了付费墙,就不需要在移动端代码中手动处理渲染逻辑来向用户展示它。这类付费墙已经包含了展示内容和展示方式的完整配置。
本指南仅适用于付费墙编辑工具构建的付费墙。远程配置付费墙的展示流程有所不同。如需了解远程配置付费墙的展示方法,请参阅渲染远程配置设计的付费墙。
要显示付费墙,请在由 createPaywallView 方法创建的 view 上调用 view.present() 方法。每个 view 只能使用一次。如果需要再次显示付费墙,请重新调用 createPaywallView 创建新的 view 实例。
重复使用同一个 view 而不重新创建,可能会导致错误。
const view = await createPaywallView(paywall);
view.setEventHandlers({
onUrlPress(url) {
window.open(url, '_blank');
return false;
},
});
try {
await view.present();
} catch (error) {
// handle the error
}使用开发者自定义计时器
要在移动应用中使用开发者自定义计时器,请使用 timerId,本示例中为 CUSTOM_TIMER_NY,即你在 Adapty 看板中设置的开发者自定义计时器的 Timer ID。这样可以确保应用动态更新计时器,显示正确的值——例如 13d 09h 03m 34s(计算方式为计时器的结束时间(如元旦)减去当前时间)。
const customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) };
const view = await createPaywallView(paywall, { customTimers });在此示例中,CUSTOM_TIMER_NY 是你在 Adapty 看板中设置的开发者自定义计时器的计时器 ID。该计时器可确保你的应用动态更新计时器显示值,例如 13d 09h 03m 34s(计算方式为计时器的结束时间(如元旦)减去当前时间)。
显示对话框
在 Android 上展示付费墙视图时,请使用此方法代替原生的 alert 对话框。在 Android 上,普通的 alert 会出现在付费墙视图的后面,导致用户看不到它。此方法可确保对话框在所有平台上都能正确显示在付费墙上方。
try {
const action = await view.showDialog({
title: 'Close paywall?',
content: 'You will lose access to exclusive offers.',
primaryActionTitle: 'Stay',
secondaryActionTitle: 'Close',
});
if (action === 'secondary') {
// User confirmed - close the paywall
await view.dismiss();
}
// If primary - do nothing, user stays
} catch (error) {
// handle error
}配置 iOS 展示样式
通过向 present() 方法传递 iosPresentationStyle 参数,可以配置付费墙在 iOS 上的展示方式。该参数接受 'full_screen'(默认值)或 'page_sheet' 两个值。
await view.present({ iosPresentationStyle: 'page_sheet' });