Оптимизация загрузки флоу и пейволов в Kotlin Multiplatform SDK

Надёжная загрузка флоу или пейвола в Kotlin Multiplatform решает три задачи: быстрый рендеринг, возврат варианта, соответствующего аудитории, и корректный фолбэк при медленной сети. Правила ниже охватывают тайминг, кеширование и резервные паттерны для достижения этих целей.

Tip

Предполагается, что Adapty.activate() и Adapty.identify() уже выполнены. См. Порядок вызовов в Kotlin Multiplatform SDK.

Правила и подводные камни

Делать этоНе делать этоПочему
Загружайте только тот плейсмент, который собираетесь показать.Не загружайте все плейсменты разом при запуске.Массовая загрузка блокирует главный поток и вызывает чёрный экран во время всплеска запросов.
Вызывайте getFlow после того, как атрибуция успеет разрешиться — например, через 1–2 секунды после activate или после срабатывания setOnProfileUpdatedListener.Не вызывайте getFlow при запуске приложения.Атрибуция ещё не пришла. Флоу разрешается по умолчанию для аудитории и незаметно обходит сегменты и персонализацию ASA.
Задайте loadTimeout и настройте резервный пейвол для каждого плейсмента.Не ждите результата getFlow бесконечно.Без таймаута пользователи с плохим соединением видят пустой экран до тех пор, пока сеть не ответит — или просто закрывают приложение.

Смотрите Получение пейволов и продуктов для справки по параметрам fetchPolicy и loadTimeout, а также Плейсменты для выбора подходящего плейсмента.

Показ медиафайлов первого экрана из бандла приложения

Флоу загружает изображения и видео из Adapty. Чтобы медиафайлы первого экрана отображались мгновенно, используйте бандл приложения вместо загрузки. Это удобно, если вы уже используете те же визуальные материалы — например, в существующем нативном онбординге.

  1. В Flow & Paywall Builder задайте пользовательский медиа-ID для изображения или видео. Загруженный там файл остаётся резервным.
  2. Добавьте файл в ресурсы приложения, в commonMain/composeResources/files/.
  3. При создании представления флоу передайте встроенный файл для этого ID в customAssets:
// "welcome_video" is the custom media ID set in the Flow & Paywall Builder
val bundledAssets: Map<String, AdaptyCustomAsset> = mapOf(
    "welcome_video" to AdaptyCustomAsset.localVideoResource(
        path = Res.getUri("files/videos/welcome.mp4")
    ),
)

AdaptyUI.createFlowView(
    flow = flow,
    customAssets = bundledAssets,
).onSuccess { view ->
    view.present()
}.onError { error ->
    // handle the error
}

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

Медиафайлы, которые вы не добавляете в бандл, всё равно отображаются сразу: в лейауте флоу есть маленькая низкокачественная копия каждого изображения, в том числе стоп-кадр видео, — она и показывается до тех пор, пока не загрузится полный файл.

Полный справочник по customAssets см. в разделе Кастомизация ассетов.

Настройка для нестабильного соединения

Для рынков с постоянно плохим качеством связи (сельские районы, транзитные зоны, регионы с проблемами маршрутизации):

  • Устанавливайте fetchPolicy = AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad при каждом запросе, кроме самого первого.
  • Настройте резервный пейвол для каждого плейсмента в дашборде Adapty.
  • Установите loadTimeout в диапазоне 3–5 секунд и принимайте резервный пейвол по истечении таймаута.
  • Не блокируйте отображение флоу на Adapty.getProfile(). Вызывайте getFlow независимо, чтобы медленный ответ профиля не блокировал интерфейс.