在 Kotlin Multiplatform SDK 中响应按钮操作
只有购买和恢复操作会被自动处理。 所有其他按钮操作,例如关闭付费墙或打开链接,都需要在应用代码中实现相应的响应逻辑。
如果您正在使用 Adapty 付费墙编辑工具构建付费墙,正确设置按钮至关重要:
- 在付费墙编辑工具中添加按钮,并为其分配一个已有操作或创建自定义操作 ID。
- 在应用代码中编写逻辑,以处理您所分配的每个操作。
本指南介绍如何在代码中处理自定义操作和已有操作。
设置 AdaptyUIPaywallsEventsObserver
要处理付费墙操作,您需要实现 AdaptyUIPaywallsEventsObserver 接口,并通过 AdaptyUI.setPaywallsEventsObserver() 进行配置。这应在应用生命周期的早期完成,通常在主 Activity 或应用初始化时进行。
import com.adapty.kmp.AdaptyUI
import com.adapty.kmp.AdaptyUIPaywallsEventsObserver
// In your app initialization
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())
关闭付费墙
要添加一个关闭付费墙的按钮:
- 在付费墙编辑工具中,添加一个按钮并为其分配 Close 操作。
- 在您的应用代码中,实现一个处理
close操作的处理程序,用于关闭付费墙。
在 Kotlin Multiplatform SDK 中,CloseAction 和 AndroidSystemBackAction 默认会触发关闭付费墙。但如果需要,您可以在代码中覆盖此行为。例如,关闭一个付费墙可能会触发打开另一个付费墙。
import com.adapty.kmp.AdaptyUI
import com.adapty.kmp.AdaptyUIPaywallsEventsObserver
import com.adapty.kmp.models.AdaptyUIAction
import com.adapty.kmp.models.AdaptyUIPaywallView
class MyAdaptyUIPaywallsEventsObserver : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
AdaptyUIAction.CloseAction, AdaptyUIAction.AndroidSystemBackAction -> view.dismiss()
}
}
}
// Set up the observer
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())
如果您正在使用 createNativePaywallView,调用 view.dismiss() 将不会产生任何效果——该视图是嵌入在您的布局中的,而非通过 KMP 栈呈现的。请从您的布局中移除该视图,并对其调用 dispose()。
从付费墙打开 URL
如果您想添加一组链接(例如使用条款和购买恢复),请在付费墙编辑工具中添加一个 Link 元素,并像处理带有 Open URL 操作的按钮一样对其进行处理。
要添加一个从付费墙打开链接的按钮(例如 Terms of use 或 Privacy policy):
- 在付费墙编辑工具中,添加一个按钮,为其分配 Open URL 操作,并输入您想要打开的 URL。
- 在您的应用代码中,实现
openUrl操作的处理程序,以在浏览器中打开接收到的 URL。
在 Kotlin Multiplatform SDK 中,OpenUrlAction 提供了需要打开的 URL。您可以实现自定义逻辑来处理 URL 的打开方式,例如显示确认对话框或使用应用程序首选的 URL 处理方法。
import androidx.compose.ui.platform.UriHandler
import com.adapty.kmp.AdaptyUI
import com.adapty.kmp.AdaptyUIPaywallsEventsObserver
import com.adapty.kmp.models.AdaptyUIAction
import com.adapty.kmp.models.AdaptyUIDialogActionType
import com.adapty.kmp.models.AdaptyUIPaywallView
import com.adapty.kmp.models.getOrNull
class MyAdaptyUIPaywallsEventsObserver(
private val uriHandler: UriHandler
) : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.OpenUrlAction -> {
// Show confirmation dialog before opening URL
mainUiScope.launch {
val selectedAction = view.showDialog(
title = "Open URL?",
content = action.url,
primaryActionTitle = "Cancel",
secondaryActionTitle = "Open"
).getOrNull()
when (selectedAction) {
AdaptyUIDialogActionType.PRIMARY -> {
// User cancelled
}
AdaptyUIDialogActionType.SECONDARY -> {
// User confirmed - open URL
uriHandler.openUri(action.url)
}
else -> Unit
}
}
}
}
}
}
// Set up the observer with UriHandler
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver(uriHandler))
登录应用
要添加一个让用户登录应用的按钮:
- 在付费墙编辑工具中,添加一个按钮并为其分配一个 ID 为 “login” 的 Custom 动作。
- 在应用代码中,实现一个自定义动作处理器来识别您的用户。
import com.adapty.kmp.AdaptyUIObserver
import com.adapty.kmp.models.AdaptyUIAction
import com.adapty.kmp.models.AdaptyUIView
class MyAdaptyUIObserver : AdaptyUIObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
if (action.action == "login") {
// Handle login action - navigate to login screen
// This depends on your app's navigation system
// For example, in Compose Multiplatform:
// navController.navigate("login")
}
}
}
}
}
处理自定义动作
要添加一个处理任意其他动作的按钮:
- 在付费墙编辑工具中,添加一个按钮,为其分配 Custom 动作,并为其指定一个 ID。
- 在您的应用代码中,为您创建的动作 ID 实现一个处理程序。
例如,如果您有另一组订阅优惠或一次性购买,可以添加一个按钮来显示另一个付费墙:
import com.adapty.kmp.AdaptyUI
import com.adapty.kmp.AdaptyUIPaywallsEventsObserver
import com.adapty.kmp.models.AdaptyUIAction
import com.adapty.kmp.models.AdaptyUIPaywallView
class MyAdaptyUIPaywallsEventsObserver : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
when (action.action) {
"login" -> {
// Handle login action - navigate to login screen
// This depends on your app's navigation system
// For example, in Compose Multiplatform:
// navController.navigate("login")
}
}
}
}
}
}
// Set up the observer
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())