Получение пейволов и продуктов для пейволов с Remote Config в Kotlin Multiplatform SDK

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

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

Перед тем как начать получать пейволы и продукты в мобильном приложении (нажмите, чтобы развернуть)
  1. Создайте продукты в дашборде Adapty.

  2. Создайте пейвол и добавьте в него продукты в дашборде Adapty.

  3. Создайте плейсменты и добавьте в них пейвол в дашборде Adapty.

  4. Установите Adapty SDK в своём мобильном приложении.

Получение информации о пейволе

В Adapty продукт — это комбинация продуктов из App Store и Google Play. Эти кросс-платформенные продукты интегрируются в пейволы, что позволяет отображать их в нужных плейсментах мобильного приложения.

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Не хардкодьте идентификаторы продуктов! Поскольку пейволы настраиваются удалённо, доступные продукты, их количество и специальные офферы (например, бесплатные пробные периоды) могут меняться со временем. Убедитесь, что ваш код корректно обрабатывает эти сценарии.
Например, если вы изначально получаете 2 продукта, приложение должно отображать именно 2 продукта. Но если позже придёт 3 продукта, приложение должно показать все 3 без изменений в коде. Хардкодить нужно только ID плейсмента.

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

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

Получение продуктов

Получив пейвол, можно запросить массив соответствующих ему продуктов:

Adapty.getPaywallProducts(paywall).onSuccess { products ->
    // запрошенные продукты
}.onError { error ->
    // обработка ошибки
}

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

ПараметрОписание
ProductsСписок объектов AdaptyPaywallProduct с идентификатором продукта, названием, ценой, валютой, длительностью подписки и другими свойствами.

При реализации собственного дизайна пейвола вам, скорее всего, понадобится доступ к свойствам объекта AdaptyPaywallProduct. Ниже приведены наиболее часто используемые из них; полный список доступен по ссылке на документацию.

СвойствоОписание
TitleДля отображения названия продукта используйте product.localizedTitle. Локализация основана на стране, выбранной пользователем в сторе, а не на локали устройства.
PriceДля отображения локализованной цены используйте product.price.localizedString. Локализация основана на локали устройства. Также можно получить цену как число через product.price.amount — значение будет в местной валюте. Символ валюты доступен через product.price.currencySymbol.
Subscription PeriodДля отображения периода (неделя, месяц, год и т. д.) используйте product.subscriptionDetails?.localizedSubscriptionPeriod. Локализация основана на локали устройства. Для программного получения периода подписки используйте product.subscriptionDetails?.subscriptionPeriod. Из него можно получить enum unit с длительностью (DAY, WEEK, MONTH, YEAR или UNKNOWN). Значение numberOfUnits даёт количество единиц периода. Например, для квартальной подписки в unit будет MONTH, а в numberOfUnits3.
Introductory OfferЧтобы показать бейдж или другой индикатор наличия introductory offer у подписки, используйте свойство product.subscriptionDetails?.introductoryOfferPhases. Это список, который может содержать до двух фаз скидки: фазу бесплатного пробного периода и фазу вводной цены. Каждый объект фазы содержит следующие полезные свойства:
paymentMode: enum со значениями FREE_TRIAL, PAY_AS_YOU_GO, PAY_UPFRONT и UNKNOWN. Бесплатные пробные периоды имеют тип FREE_TRIAL.
price: цена со скидкой как число. Для бесплатных пробных периодов здесь будет 0.
localizedNumberOfPeriods: строка, локализованная с учётом локали устройства, описывающая длительность оффера. Например, трёхдневный пробный период отобразится как 3 days.
subscriptionPeriod: отдельные детали периода оффера. Работает так же, как описано в предыдущем разделе.
localizedSubscriptionPeriod: форматированный период подписки скидки для локали пользователя.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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