Получение пейволов Paywall Builder и их конфигурации в Kotlin Multiplatform SDK

После того как вы разработали визуальную часть пейвола с помощью нового Paywall Builder в дашборде Adapty, вы можете отобразить его в своём мобильном приложении. Первый шаг — получить пейвол, связанный с плейсментом, и его конфигурацию представления, как описано ниже.

Обратите внимание, что эта тема относится к пейволам, настроенным с помощью Paywall Builder. Если вы реализуете пейволы вручную, обратитесь к теме Получение пейволов и продуктов для Remote Config пейволов в мобильном приложении.

Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши примеры приложений — они демонстрируют полную настройку: отображение пейволов, совершение покупок и другие базовые функции.

Перед тем как начать отображать пейволы в мобильном приложении (нажмите, чтобы развернуть)
  1. Создайте продукты в дашборде Adapty.
  2. Создайте пейвол и добавьте в него продукты в дашборде Adapty.
  3. Создайте плейсменты и добавьте в них пейвол в дашборде Adapty.
  4. Установите Adapty SDK в своё мобильное приложение.

Получение пейвола, созданного с помощью Paywall Builder

Если вы создали пейвол с помощью Paywall Builder, вам не нужно самостоятельно реализовывать его отрисовку в коде мобильного приложения. Такой пейвол содержит всё необходимое: и что показывать, и как это показывать. Тем не менее вам нужно получить его идентификатор через плейсмент, конфигурацию представления, а затем отобразить пейвол в приложении.

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

Для получения пейвола используйте метод getPaywall:


Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}

Параметры:

ПараметрОбязательностьОписание
placementIdобязательныйИдентификатор нужного плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty.
locale

необязательный

по умолчанию: en

Идентификатор локализации пейвола. Ожидается языковой код из одного или двух подтегов, разделённых символом минус (-). Первый подтег — язык, второй — регион.

Пример: en — английский язык, pt-br — бразильский португальский.

Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе Локализации и коды локалей.

fetchPolicyпо умолчанию: AdaptyPaywallFetchPolicy.Default

По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует актуальность данных.

Однако если вы предполагаете, что у ваших пользователей нестабильное интернет-соединение, рассмотрите использование AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad — он возвращает кешированные данные, если они есть. В этом случае пользователи могут не получить самые свежие данные, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для сокращения сетевых запросов.

Кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.

Adapty SDK хранит пейволы локально в двух слоях: регулярно обновляемый кеш и резервные пейволы. Для ускорения загрузки используется CDN, а также отдельный резервный сервер на случай недоступности CDN. Эта система обеспечивает актуальность пейволов и надёжность даже при нестабильном интернет-соединении.

loadTimeoutпо умолчанию: 5 сек

Ограничивает время ожидания для этого метода. Если таймаут истёк, будут возвращены кешированные данные или локальный резервный вариант.

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

Для Kotlin Multiplatform: можно создать TimeInterval с помощью функций-расширений (например, 5.seconds, где .seconds — из import com.adapty.utils.seconds) или TimeInterval.seconds(5). Чтобы снять ограничение, используйте TimeInterval.INFINITE.

Параметры ответа:

ПараметрОписание
PaywallОбъект AdaptyPaywall со списком идентификаторов продуктов, идентификатором пейвола, Remote Config и рядом других свойств.

Получение конфигурации представления пейвола, созданного с помощью Paywall Builder

Убедитесь, что в Paywall Builder включён переключатель Show on device. Если эта опция не активирована, конфигурация представления не будет доступна для получения.

После получения пейвола проверьте, содержит ли он ViewConfiguration — это означает, что пейвол создан с помощью Paywall Builder. Результат проверки определяет способ отображения пейвола. Если ViewConfiguration присутствует, обрабатывайте его как пейвол Paywall Builder; если нет — обрабатывайте как Remote Config пейвол.

Используйте метод createPaywallView для загрузки конфигурации представления.


if (paywall.hasViewConfiguration) {
    AdaptyUI.createPaywallView(
        paywall = paywall,
        loadTimeout = 5.seconds,
        preloadProducts = true
    ).onSuccess { paywallView ->
        // use paywallView
    }.onError { error ->
        // handle the error
    }
} else {
    // use your custom logic
}
ПараметрОбязательностьОписание
paywallобязательныйОбъект AdaptyPaywall для получения контроллера нужного пейвола.
loadTimeoutнеобязательныйОграничивает время ожидания для этого метода. Если таймаут истёк, будут возвращены кешированные данные или локальный резервный вариант. Обратите внимание, что в редких случаях метод может завершиться чуть позже указанного времени, так как операция может включать несколько запросов. Можно использовать функции-расширения, например 5.seconds из kotlin.time.Duration.Companion.
preloadProductsнеобязательныйУстановите true, чтобы предварительно загрузить продукты для повышения производительности. При включении продукты загружаются заранее, что сокращает время отображения пейвола.
productPurchaseParamsнеобязательныйСловарь AdaptyProductIdentifier в AdaptyPurchaseParameters. Используйте его для настройки параметров покупки — например, персонализированных предложений или параметров обновления подписки для отдельных продуктов в пейволе.

Если вы используете несколько языков, узнайте, как добавить локализацию Paywall Builder.

После загрузки отобразите пейвол.

Получение пейвола для аудитории по умолчанию для ускорения загрузки

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

Для этого можно использовать метод getPaywallForDefaultAudience, который получает пейвол указанного плейсмента для аудитории All Users. Однако важно понимать, что рекомендованный подход — получать пейвол через метод getPaywall, как описано в разделе Получение пейвола выше.

Почему мы рекомендуем использовать getPaywall

Метод getPaywallForDefaultAudience имеет ряд существенных недостатков:

  • Возможные проблемы с обратной совместимостью: если вам нужно показывать разные пейволы для разных версий приложения (текущей и будущих), могут возникнуть трудности. Вам придётся либо проектировать пейволы с поддержкой текущей (устаревшей) версии, либо смириться с тем, что пользователи с текущей (устаревшей) версией могут столкнуться с проблемами при отображении пейволов.
  • Потеря таргетинга: все пользователи увидят один и тот же пейвол, разработанный для аудитории All Users, — вы теряете персонализированный таргетинг (в том числе по странам, маркетинговой атрибуции или собственным пользовательским атрибутам).

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


Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}
ПараметрОбязательностьОписание
placementIdобязательныйИдентификатор плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty.
locale

необязательный

по умолчанию: en

Идентификатор локализации пейвола. Ожидается языковой код из одного или нескольких подтегов, разделённых символом минус (-). Первый подтег — язык, второй — регион.

Пример: en — английский язык, pt-br — бразильский португальский.

Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе Локализации и коды локалей.

fetchPolicyпо умолчанию: AdaptyPaywallFetchPolicy.Default

По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует актуальность данных.

Однако если вы предполагаете, что у ваших пользователей нестабильное интернет-соединение, рассмотрите использование AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad — он возвращает кешированные данные, если они есть. В этом случае пользователи могут не получить самые свежие данные, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для сокращения сетевых запросов.

Кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.

Настройка ресурсов

Для кастомизации изображений и видео в пейволе используйте пользовательские ресурсы.

У главных изображений и видео есть предопределённые идентификаторы: hero_image и hero_video. В наборе пользовательских ресурсов вы обращаетесь к этим элементам по их идентификаторам и настраиваете их поведение.

Для остальных изображений и видео необходимо задать пользовательский идентификатор в дашборде Adapty.

Например, вы можете:

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

Для использования этой функции обновите Adapty SDK до версии 3.7.0 или выше.

Пример того, как передать пользовательские ресурсы через словарь:

Kotlin Multiplatform SDK поддерживает только локальные ресурсы. Для удалённого контента необходимо предварительно скачать и кешировать ресурсы локально перед использованием в пользовательских ресурсах.

// Import generated Res class for accessing resources

viewModelScope.launch {
    // Get URIs for bundled resources using Res.getUri()
    val heroImagePath = Res.getUri("files/images/hero_image.png")
    val demoVideoPath = Res.getUri("files/videos/demo_video.mp4")

    // Or read image as byte data
    val imageByteData = Res.readBytes("files/images/avatar.png")

    // Create custom assets map
    val customAssets: Map<String, AdaptyCustomAsset> = mapOf(
        // Load image from app resources (bundled with the app)
        // Files should be placed in commonMain/composeResources/files/
        "hero_image" to AdaptyCustomAsset.localImageResource(
            path = heroImagePath
        ),

        // Or use image byte data
        "avatar" to AdaptyCustomAsset.localImageData(
            data = imageByteData
        ),

        // Load video from app resources
        "demo_video" to AdaptyCustomAsset.localVideoResource(
            path = demoVideoPath
        ),

        // Or use a video file from device storage
        "intro_video" to AdaptyCustomAsset.localVideoFile(
            path = "/path/to/local/video.mp4"
        ),

        // Apply custom brand colors
        "brand_primary" to AdaptyCustomAsset.color(
            colorHex = "#FF6B35"
        ),

        // Create gradient background
        "card_gradient" to AdaptyCustomAsset.linearGradient(
            colors = listOf("#1E3A8A", "#3B82F6", "#60A5FA"),
            stops = listOf(0.0f, 0.5f, 1.0f)
        )
    )

    // Use custom assets when creating paywall view
    AdaptyUI.createPaywallView(
        paywall = paywall,
        customAssets = customAssets
    ).onSuccess { paywallView ->
        // Present the paywall with custom assets
        paywallView.present()
    }.onError { error ->
        // Handle the error - paywall will fall back to default appearance
    }
}

Если ресурс не найден или не удалось загрузить, пейвол вернётся к внешнему виду по умолчанию, настроенному в Paywall Builder.