Реагирование на действия флоу - Kotlin Multiplatform

Если вы создаёте флоу или пейволы с помощью Adapty Flow Builder или Paywall Builder, важно правильно настроить кнопки:

  1. Добавьте кнопку в Builder и назначьте ей существующее действие или создайте собственный ID действия.
  2. Напишите код в приложении для обработки каждого назначенного действия.

В этом гайде показано, как обрабатывать пользовательские и встроенные действия в коде.

Покупки, восстановление покупок, закрытие флоу/пейвола и открытие ссылок обрабатываются автоматически. Все остальные действия кнопок, например пользовательские действия, требуют явной реализации в коде приложения.

Настройка AdaptyUIFlowsEventsObserver

Чтобы обрабатывать действия флоу, нужно реализовать интерфейс AdaptyUIFlowsEventsObserver и зарегистрировать его через AdaptyUI.setFlowsEventsObserver(). Это следует сделать как можно раньше в жизненном цикле приложения — как правило, в основной активности или при инициализации приложения.


// In your app initialization
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())

Все действия кнопок поступают в колбэк flowViewDidPerformAction(view, action) в виде sealed-класса AdaptyUIAction: CloseAction, AndroidSystemBackAction, OpenUrlAction или CustomAction.

Переопределение flowViewDidPerformAction заменяет обработку по умолчанию для всех действий, а не только для того, которое вас интересует. Оставляйте ветки по умолчанию для CloseAction (закрыть флоу) и OpenUrlAction (открыть URL), если вы не планируете их менять, — как показано в примерах ниже.

Закрытие флоу и пейволов

Чтобы добавить кнопку закрытия флоу или пейвола:

  1. В конструкторе добавьте кнопку и назначьте ей действие Close.
  2. В коде приложения реализуйте обработчик действия close, который скрывает флоу.

В Kotlin Multiplatform SDK действие CloseAction по умолчанию закрывает флоу или пейвол. Однако при необходимости это поведение можно переопределить в коде — например, закрытие одного флоу может вызывать открытие другого.


class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction ->
                mainUiScope.launch { view.dismiss() } // default behavior
            is AdaptyUIAction.OpenUrlAction ->
                AdaptyUI.openWebUrl(action.url, action.openIn) // default behavior
            else -> Unit
        }
    }
}

// Set up the observer
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())

Если вы используете createNativeFlowView, вызов view.dismiss() не даст никакого эффекта — представление встроено в ваш макет, а не отображается через стек KMP. Удалите представление из макета и вызовите вместо этого dispose().

Обработка системной кнопки «Назад» на Android

Нажатие системной кнопки «Назад» на Android (или соответствующий жест) генерирует AdaptyUIAction.AndroidSystemBackAction. По умолчанию это действие игнорируется — флоу остаётся открытым, и пользователь выходит из него через путь, который вы определяете, например кнопку Close или действие on_device_back в билдере. Если вы хотите, чтобы системная кнопка «Назад» закрывала флоу, обработайте это действие самостоятельно:

class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction ->
                mainUiScope.launch { view.dismiss() } // default behavior
            is AdaptyUIAction.AndroidSystemBackAction ->
                mainUiScope.launch { view.dismiss() } // not handled by default
            is AdaptyUIAction.OpenUrlAction ->
                AdaptyUI.openWebUrl(action.url, action.openIn) // default behavior
            else -> Unit
        }
    }
}

Открытие URL из флоу и пейволов

Если нужно добавить группу ссылок (например, условия использования и восстановление покупок), добавьте элемент Link в билдере и обработайте его так же, как кнопки с действием Open URL.

Чтобы добавить кнопку, открывающую ссылку из флоу или пейвола (например, Terms of use или Privacy policy), в билдере добавьте кнопку, назначьте ей действие Open URL и введите нужный URL.

По умолчанию SDK открывает полученный URL нативно — во внешнем или встроенном браузере, в зависимости от action.openIn — так что никакого кода писать не нужно. Переопределите обработчик только если требуется кастомная логика, например показ диалога подтверждения перед открытием:


class MyAdaptyUIFlowsEventsObserver(
    private val uriHandler: UriHandler
) : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, 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
                    }
                }
            }
            else -> Unit
        }
    }
}

// Set up the observer with UriHandler
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver(uriHandler))

Войдите в приложение

Чтобы добавить кнопку входа в приложение:

  1. В конструкторе добавьте кнопку и назначьте ей действие Custom с ID «login».
  2. В коде приложения реализуйте обработчик этого пользовательского действия, который идентифицирует пользователя.

class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, 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")
                }
            }
            else -> Unit
        }
    }
}

Обработка пользовательских действий

Чтобы добавить кнопку для обработки любых других действий:

  1. В конструкторе добавьте кнопку, назначьте ей действие Custom и задайте ей ID.
  2. В коде приложения реализуйте обработчик для созданного вами ID действия.

Например, если у вас есть другой набор предложений подписки или разовых покупок, вы можете добавить кнопку, которая будет отображать другой флоу или пейвол:


class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CustomAction -> {
                when (action.action) {
                    "openNewFlow" -> {
                        // Display another flow or paywall
                    }
                }
            }
            else -> Unit
        }
    }
}

// Set up the observer
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())

Только покупки и восстановления обрабатываются автоматически. Все остальные действия кнопок, такие как закрытие пейволов или открытие ссылок, требуют реализации соответствующих обработчиков в коде приложения.

Если вы создаёте пейволы с помощью Paywall Builder в Adapty, важно правильно настроить кнопки:

  1. Добавьте кнопку в Paywall Builder и назначьте ей готовое действие или создайте собственный ID действия.
  2. Напишите код в своём приложении для обработки каждого назначенного действия.

Этот гайд описывает, как обрабатывать пользовательские и встроенные действия в вашем коде.

Настройка AdaptyUIPaywallsEventsObserver

Чтобы обрабатывать действия на пейволе, нужно реализовать интерфейс AdaptyUIPaywallsEventsObserver и зарегистрировать его через AdaptyUI.setPaywallsEventsObserver(). Это следует делать как можно раньше в жизненном цикле приложения — обычно в главной активности или при инициализации приложения.


// In your app initialization
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())

Закрытие пейволов

Чтобы добавить кнопку закрытия пейвола:

  1. В Paywall Builder добавьте кнопку и назначьте ей действие Close.
  2. В коде приложения реализуйте обработчик действия close, который закрывает пейвол.

В SDK для Kotlin Multiplatform CloseAction и AndroidSystemBackAction по умолчанию вызывают закрытие пейвола. При необходимости это поведение можно переопределить в коде. Например, закрытие одного пейвола может инициировать открытие другого.


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 в Paywall Builder и обработайте его так же, как кнопки с действием Open URL.

Чтобы добавить кнопку, открывающую ссылку с вашего пейвола (например, Terms of use или Privacy policy):

  1. В Paywall Builder добавьте кнопку, назначьте ей действие Open URL и введите URL, который нужно открыть.
  2. В коде приложения реализуйте обработчик действия openUrl, который открывает полученный URL в браузере.

В Kotlin Multiplatform SDK OpenUrlAction предоставляет URL, который нужно открыть. Вы можете реализовать собственную логику обработки открытия URL — например, показать диалог подтверждения или использовать предпочтительный способ обработки URL в вашем приложении.


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))

Войдите в приложение

Чтобы добавить кнопку для входа пользователей в ваше приложение:

  1. В Paywall Builder добавьте кнопку и назначьте ей действие Custom с ID “login”.
  2. В коде вашего приложения реализуйте обработчик этого действия, который идентифицирует пользователя.

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")
                }
            }
        }
    }
}

Обработка пользовательских действий

Чтобы добавить кнопку, выполняющую произвольное действие:

  1. В Paywall Builder добавьте кнопку, назначьте ей действие Custom и укажите идентификатор.
  2. В коде приложения реализуйте обработчик для созданного идентификатора действия.

Например, если у вас есть другой набор предложений по подписке или разовых покупок, можно добавить кнопку, которая откроет другой пейвол:


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())