Обработка событий онбординга в Android SDK

Прежде чем начать, убедитесь, что:

  1. Вы установили Adapty Android SDK версии 3.8.0 или новее.
  2. Вы создали онбординг.
  3. Вы добавили онбординг в плейсмент.

Онбординги, настроенные через билдер, генерируют события, на которые ваше приложение может реагировать. Ниже описано, как это сделать.

Чтобы управлять процессами на экране онбординга в Android-приложении или отслеживать их, реализуйте интерфейс AdaptyOnboardingEventListener.

Пользовательские действия

В конструкторе вы можете добавить пользовательское действие к кнопке и назначить ему ID. Затем вы можете использовать этот ID в своём коде и обрабатывать его как пользовательское действие.

ios-events-1.webp

Например, если пользователь нажмёт кастомную кнопку — скажем, Login или Allow notifications, — будет вызван метод делегата onCustomAction с ID действия из билдера. Вы можете задавать собственные ID, например “allowNotifications”.

class YourActivity : AppCompatActivity() {
    private val eventListener = object : AdaptyOnboardingEventListener {
        override fun onCustomAction(action: AdaptyOnboardingCustomAction, context: Context) {
            when (action.actionId) {
                "allowNotifications" -> {
                    // Request notification permissions
                }
            }
        }
        
        override fun onError(error: AdaptyOnboardingError, context: Context) {
            // Handle errors
        }
        
        // ... other required delegate methods
    }
}
Пример события (нажмите, чтобы развернуть)
{
  "actionId": "allowNotifications",
  "meta": {
    "onboardingId": "onboarding_123",
    "screenClientId": "profile_screen",
    "screenIndex": 0,
    "screensTotal": 3
  }
}

Закрытие онбординга

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

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

Например:

override fun onCloseAction(action: AdaptyOnboardingCloseAction, context: Context) {
    // Dismiss the onboarding screen
    (context as? Activity)?.onBackPressed()
}
Пример события (нажмите, чтобы развернуть)
{
  "action_id": "close_button",
  "meta": {
    "onboarding_id": "onboarding_123",
    "screen_cid": "final_screen",
    "screen_index": 3,
    "total_screens": 4
  }
}

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

Обрабатывайте это событие, если хотите открыть пейвол внутри онбординга. Если же нужно открыть пейвол после его закрытия, есть более простой способ — обработайте AdaptyOnboardingCloseAction и откройте пейвол без использования данных события.

Самый удобный подход — сделать ID действия равным ID плейсмента пейвола. Тогда после получения AdaptyOnboardingOpenPaywallAction можно сразу использовать ID плейсмента, чтобы получить и открыть пейвол:

override fun onOpenPaywallAction(action: AdaptyOnboardingOpenPaywallAction, context: Context) {
    // Get the paywall using the placement ID from the action
    Adapty.getPaywall(placementId = action.actionId) { result ->
        when (result) {
            is AdaptyResult.Success -> {
                val paywall = result.value
                // Get the paywall configuration
                AdaptyUI.getViewConfiguration(paywall) { result ->
                    when(result) {
                        is AdaptyResult.Success -> {
                            val paywallConfig = result.value
                            // Create and present the paywall
                            val paywallView = AdaptyUI.getPaywallView(
                                activity = this,
                                viewConfig = paywallConfig,
                                products,
                                eventListener = paywallEventListener
                            )
                            // Add the paywall view to your layout
                            binding.container.addView(paywallView)
                        }
                        is AdaptyResult.Error -> {
                            val error = result.error
                            // handle the error
                        }
                    }
                }
            is AdaptyResult.Error -> {
                val error = result.error
                // handle the error
            }        
        }
    }
}
Пример события (нажмите, чтобы развернуть)
{
    "action_id": "premium_offer_1",
    "meta": {
        "onboarding_id": "onboarding_123",
        "screen_cid": "pricing_screen",
        "screen_index": 2,
        "total_screens": 4
    }
}

Завершение загрузки онбординга

Когда онбординг завершает загрузку, вызывается этот метод:

override fun onFinishLoading(action: AdaptyOnboardingLoadedAction, context: Context) {
    // Handle loading completion
}
Пример события (нажмите, чтобы раскрыть)
{
    "meta": {
        "onboarding_id": "onboarding_123",
        "screen_cid": "welcome_screen",
        "screen_index": 0,
        "total_screens": 4
    }
}

Метод onAnalyticsEvent вызывается при различных аналитических событиях во время флоу онбординга. Объект event может быть одного из следующих типов:

ТипОписание
OnboardingStartedКогда онбординг загружен
ScreenPresentedКогда отображается любой экран
ScreenCompletedКогда экран завершён. Включает необязательный elementId (идентификатор завершённого элемента) и необязательный reply (ответ пользователя). Срабатывает, когда пользователь выполняет любое действие для выхода с экрана.
SecondScreenPresentedКогда отображается второй экран
UserEmailCollectedСрабатывает, когда email пользователя собирается через поле ввода
OnboardingCompletedСрабатывает, когда пользователь достигает экрана с идентификатором final. Если вам нужно это событие, назначьте идентификатор final последнему экрану.
UnknownДля любого нераспознанного типа события. Включает name (название неизвестного события) и meta (дополнительные метаданные)
Каждое событие содержит meta-информацию:
ПолеОписание
onboardingIdУникальный идентификатор флоу онбординга
screenClientIdИдентификатор текущего экрана
screenIndexПорядковый номер текущего экрана во флоу
totalScreensОбщее количество экранов во флоу

Пример использования аналитических событий для трекинга:

override fun onAnalyticsEvent(event: AdaptyOnboardingAnalyticsEvent, context: Context) {
    when (event) {
        is AdaptyOnboardingAnalyticsEvent.OnboardingStarted -> {
            // Отслеживаем начало онбординга
            trackEvent("onboarding_started", event.meta)
        }
        is AdaptyOnboardingAnalyticsEvent.ScreenPresented -> {
            // Отслеживаем показ экрана
            trackEvent("screen_presented", event.meta)
        }
        is AdaptyOnboardingAnalyticsEvent.ScreenCompleted -> {
            // Отслеживаем завершение экрана с ответом пользователя
            trackEvent("screen_completed", event.meta, event.elementId, event.reply)
        }
        is AdaptyOnboardingAnalyticsEvent.OnboardingCompleted -> {
            // Отслеживаем успешное завершение онбординга
            trackEvent("onboarding_completed", event.meta)
        }
        is AdaptyOnboardingAnalyticsEvent.Unknown -> {
            // Обрабатываем неизвестные события
            trackEvent(event.name, event.meta)
        }
        // При необходимости обработайте другие случаи
    }
}
Примеры событий (нажмите, чтобы раскрыть)
// 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
    }
}