Получение флоу и пейволов - Android

Что возвращает getFlow
✦
Флоу Создаются в Flow & Paywall Builder — рендерятся нативно на устройстве, без WebView
✦
Пейволы старого Paywall Builder Весь контент, созданный в старом Paywall Builder

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

Tip

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

Перед началом работы

Вам понадобится:

Получение флоу/пейвола

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

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

Tip

Чтобы прогреть несколько плейсментов сразу, вызовите preloadFlows (Android SDK 4.1+). Метод кэширует только JSON плейсмента, поэтому конфигурацию отображения для получения макета и изображений нужно запрашивать отдельно.

Чтобы получить флоу или пейвол, используйте метод getFlow:

Параметры:

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

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

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

Третья политика, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), находится между двумя описанными: она читает кеш, пока кешированная копия моложе maxAgeMillis, и обращается к серверу, когда та становится старше.

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

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

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

Это значение ограничивает таймаут данного метода. При достижении таймаута будут возвращены кешированные данные или локальный резервный пейвол.

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

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

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

ПараметрОписание
FlowОбъект AdaptyFlow, содержащий плейсмент, идентификаторы (id, variationId), название варианта (variationName, необязательно, SDK 4.2+), название, варианты пейвола (paywalls), Remote Config и флаг hasViewConfiguration, указывающий, включает ли флоу конфигурацию представления. Чтобы получить актуальные продукты для предварительной загрузки, кастомного UI или программных проверок, вызовите getPaywallProducts(flow).

Получение конфигурации отображения

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

  • true — плейсмент был создан в Flow & Paywall Builder (флоу) или в старом Paywall Builder (пейвол). Adapty самостоятельно отрисовывает интерфейс. Продолжайте выполнять шаги ниже, чтобы получить конфигурацию отображения и показать флоу или пейвол.
  • false — плейсмент является пользовательским пейволом без интерфейса Builder. Обработайте его как пейвол с Remote Config.
Important

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

Note

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

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

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

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

Чтобы решить эту проблему, используйте метод getFlowForDefaultAudience, который получает флоу или пейвол указанного плейсмента для аудитории All Users. Однако важно понимать, что рекомендуемый подход — получать флоу или пейвол через метод getFlow, как описано в разделе Получение флоу/пейвола выше.

Warning

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

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

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

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

ПараметрНаличиеОписание
placementIdобязательныйИдентификатор плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty.
fetchPolicyпо умолчанию: AdaptyPlacementFetchPolicy.Default

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

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

Третья политика, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), занимает промежуточное положение: кэш читается первым, пока его возраст меньше maxAgeMillis, и только после этого выполняется запрос к серверу.

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

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

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

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

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

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

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

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

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val flowView = AdaptyUI.getFlowView(
    activity,
    flowConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

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

Для видео можно дополнительно передать resolution, чтобы заранее зарезервировать место в макете и задать соотношение сторон (width / height) до загрузки видео:

AdaptyCustomVideoAsset.file(
    FileLocation.fromResId(requireContext(), R.raw.custom_video),
    preview = AdaptyCustomImageAsset.file(
        FileLocation.fromResId(requireContext(), R.drawable.video_preview),
    ),
    resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920),
)

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

Warning

Пейволы, созданные в Paywall Builder для SDK 3.x, требуют Android SDK версии 3.0 или выше.

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

Tip

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

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

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

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

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

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

Параметры:

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

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

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

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

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

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

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

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

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

Третья политика, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), находится между двумя предыдущими: сначала читает кэш, пока он не старше maxAgeMillis, и обращается к серверу, когда кэш устарел.

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

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

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

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

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

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

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

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

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

Important

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

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

Note

Если вы поддерживаете несколько языков, добавьте локализацию к вашему пейволу. Коды для использования смотрите в разделе Локализации и коды локалей.

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

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

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

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

Warning

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

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

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

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

Note

Метод getPaywallForDefaultAudience доступен начиная с Android SDK 2.11.3

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

опциональный

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

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

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

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

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

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

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

Третья политика, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), занимает промежуточное положение: она читает кеш, пока его возраст меньше maxAgeMillis, и обращается к серверу, когда кеш устаревает.

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

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

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

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

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

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

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

Чтобы использовать эту функцию, обновите Adapty Android SDK до версии 3.7.0 или выше.

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

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val paywallView = AdaptyUI.getPaywallView(
    activity,
    viewConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

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