---
title: "Получение пейволов и продуктов для пейволов с Remote Config в Kotlin Multiplatform SDK"
description: "Получайте пейволы и продукты в Adapty Kotlin Multiplatform SDK для улучшения монетизации пользователей."
---

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

:::tip

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

:::

<details>
   <summary>Перед тем как начать получать пейволы и продукты в мобильном приложении (нажмите, чтобы развернуть)</summary>

   1. [Создайте продукты](create-product) в дашборде Adapty.

2. [Создайте пейвол и добавьте в него продукты](create-paywall) в дашборде Adapty.

3. [Создайте плейсменты и добавьте в них пейвол](create-placement) в дашборде Adapty.

4. [Установите Adapty SDK](sdk-installation-kotlin-multiplatform) в своём мобильном приложении.
</details>

## Получение информации о пейволе \{#fetch-paywall-information\}

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

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

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

```kotlin showLineNumbers

Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID", 
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { paywall ->
    // запрошенный пейвол
}.onError { error ->
    // обработка ошибки
}
```

| Параметр | Обязательность | Описание |
|---------|--------|-----------|
| **placementId** | обязательный | Идентификатор [плейсмента](placements). Это значение вы указали при создании плейсмента в дашборде Adapty. |
| **locale** | <p>необязательный</p><p>по умолчанию: `en`</p> | <p>Идентификатор [локализации пейвола](add-remote-config-locale). Ожидается языковой код, состоящий из одного или нескольких подтегов, разделённых символом минус (**-**). Первый подтег — язык, второй — регион.</p><p></p><p>Например: `en` — английский, `pt-br` — бразильский португальский.</p> |
| **fetchPolicy** | по умолчанию: `AdaptyPaywallFetchPolicy.Default` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант: он гарантирует, что пользователи всегда получают актуальные данные.</p><p></p><p>Однако если у ваших пользователей нестабильное интернет-соединение, рассмотрите `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` — он возвращает кешированные данные, если они есть. В этом случае данные могут быть не самыми свежими, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии, чтобы избежать лишних сетевых запросов.</p><p></p><p>Обратите внимание: кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.</p><p></p><p>Adapty SDK хранит пейволы на двух уровнях: регулярно обновляемый кеш и [резервные пейволы](kmp-use-fallback-paywalls). Также используется CDN для более быстрой загрузки и отдельный резервный сервер на случай недоступности CDN. Эта система гарантирует, что вы всегда получаете актуальную версию пейволов даже при слабом интернет-соединении.</p> |
| **loadTimeout** | по умолчанию: 5 сек | <p>Ограничивает таймаут для этого метода. Если таймаут истёк, возвращаются кешированные данные или локальный резервный вариант.</p><p></p><p>В редких случаях метод может завершиться чуть позже указанного значения `loadTimeout`, так как операция может включать несколько последовательных запросов.</p> |

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

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

| Параметр | Описание |
| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Paywall   | Объект [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) со списком ID продуктов, идентификатором пейвола, Remote Config и другими свойствами. |

## Получение продуктов \{#fetch-products\}

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

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

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

| Параметр | Описание |
| :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Products  | Список объектов [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) с идентификатором продукта, названием, ценой, валютой, длительностью подписки и другими свойствами. |

При реализации собственного дизайна пейвола вам, скорее всего, понадобится доступ к свойствам объекта [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/). Ниже приведены наиболее часто используемые из них; полный список доступен по ссылке на документацию.

| Свойство                | Описание |
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **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`, а в `numberOfUnits` — `3`. |
| **Introductory Offer**  | Чтобы показать бейдж или другой индикатор наличия introductory offer у подписки, используйте свойство `product.subscriptionDetails?.introductoryOfferPhases`. Это список, который может содержать до двух фаз скидки: фазу бесплатного пробного периода и фазу вводной цены. Каждый объект фазы содержит следующие полезные свойства:<br/>• `paymentMode`: enum со значениями `FREE_TRIAL`, `PAY_AS_YOU_GO`, `PAY_UPFRONT` и `UNKNOWN`. Бесплатные пробные периоды имеют тип `FREE_TRIAL`.<br/>• `price`: цена со скидкой как число. Для бесплатных пробных периодов здесь будет `0`.<br/>• `localizedNumberOfPeriods`: строка, локализованная с учётом локали устройства, описывающая длительность оффера. Например, трёхдневный пробный период отобразится как `3 days`.<br/>• `subscriptionPeriod`: отдельные детали периода оффера. Работает так же, как описано в предыдущем разделе.<br/>• `localizedSubscriptionPeriod`: форматированный период подписки скидки для локали пользователя. |

## Ускорение загрузки пейвола с помощью пейвола для аудитории по умолчанию \{#speed-up-paywall-fetching-with-default-audience-paywall\}

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

Для этого можно использовать метод `getPaywallForDefaultAudience`, который получает пейвол указанного плейсмента для аудитории **All Users**. Тем не менее важно понимать, что рекомендуемый подход — использование метода `getPaywall`, описанного в разделе [Получение информации о пейволе](fetch-paywalls-and-products-kmp#fetch-paywall-information) выше.

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

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

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

Если вы готовы принять эти ограничения ради ускорения загрузки пейволов, используйте метод `getPaywallForDefaultAudience` как показано ниже. В противном случае придерживайтесь метода `getPaywall`, описанного [выше](fetch-paywalls-and-products-kmp#fetch-paywall-information).
:::

```kotlin showLineNumbers

Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default
).onSuccess { paywall ->
    // запрошенный пейвол
}.onError { error ->
    // обработка ошибки
}
```

| Параметр | Обязательность | Описание |
|---------|--------|-----------|
| **placementId** | обязательный | Идентификатор [плейсмента](placements). Это значение вы указали при создании плейсмента в дашборде Adapty. |
| **locale** | <p>необязательный</p><p>по умолчанию: `en`</p> | <p>Идентификатор [локализации пейвола](add-remote-config-locale). Ожидается языковой код, состоящий из одного или нескольких подтегов, разделённых символом минус (**-**). Первый подтег — язык, второй — регион.</p><p></p><p>Например: `en` — английский, `pt-br` — бразильский португальский.</p><p></p> |
| **fetchPolicy** | по умолчанию: `AdaptyPaywallFetchPolicy.Default` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант: он гарантирует, что пользователи всегда получают актуальные данные.</p><p></p><p>Однако если у ваших пользователей нестабильное интернет-соединение, рассмотрите `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` — он возвращает кешированные данные, если они есть. В этом случае данные могут быть не самыми свежими, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии, чтобы избежать лишних сетевых запросов.</p><p></p><p>Обратите внимание: кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.</p> |