Оптимизация загрузки флоу и пейволов в Kotlin Multiplatform SDK
Надёжная загрузка флоу или пейвола в Kotlin Multiplatform решает три задачи: быстрый рендеринг, возврат варианта, соответствующего аудитории, и корректный фолбэк при медленной сети. Правила ниже охватывают тайминг, кеширование и резервные паттерны для достижения этих целей.
Предполагается, что Adapty.activate() и Adapty.identify() уже выполнены. См. Порядок вызовов в Kotlin Multiplatform SDK.
Правила и подводные камни
| Делать это | Не делать это | Почему |
|---|---|---|
| Загружайте только тот плейсмент, который собираетесь показать. | Не загружайте все плейсменты разом при запуске. | Массовая загрузка блокирует главный поток и вызывает чёрный экран во время всплеска запросов. |
Вызывайте getFlow после того, как атрибуция успеет разрешиться — например, через 1–2 секунды после activate или после срабатывания setOnProfileUpdatedListener. | Не вызывайте getFlow при запуске приложения. | Атрибуция ещё не пришла. Флоу разрешается по умолчанию для аудитории и незаметно обходит сегменты и персонализацию ASA. |
Задайте loadTimeout и настройте резервный пейвол для каждого плейсмента. | Не ждите результата getFlow бесконечно. | Без таймаута пользователи с плохим соединением видят пустой экран до тех пор, пока сеть не ответит — или просто закрывают приложение. |
Смотрите Получение пейволов и продуктов для справки по параметрам fetchPolicy и loadTimeout, а также Плейсменты для выбора подходящего плейсмента.
Показ медиафайлов первого экрана из бандла приложения
Флоу загружает изображения и видео из Adapty. Чтобы медиафайлы первого экрана отображались мгновенно, используйте бандл приложения вместо загрузки. Это удобно, если вы уже используете те же визуальные материалы — например, в существующем нативном онбординге.
- В Flow & Paywall Builder задайте пользовательский медиа-ID для изображения или видео. Загруженный там файл остаётся резервным.
- Добавьте файл в ресурсы приложения, в
commonMain/composeResources/files/. - При создании представления флоу передайте встроенный файл для этого 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независимо, чтобы медленный ответ профиля не блокировал интерфейс.