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

Прежде чем отображать пейволы на основе Remote Config или кастомные пейволы, нужно получить информацию о них. Обратите внимание: этот раздел посвящён пейволам с Remote Config и кастомным пейволам. Если вы используете пейволы, настроенные в Paywall Builder, обратитесь к разделу [Получение пейволов Paywall Builder и их конфигурации](capacitor-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-capacitor) в своём мобильном приложении.
</details>

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

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

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

```typescript showLineNumbers

try {
  const paywall = await adapty.getPaywall({ 
    placementId: 'YOUR_PLACEMENT_ID', 
    locale: 'en',
    params: {
      fetchPolicy: 'reload_revalidating_cache_data', // Load from server, fallback to cache
      loadTimeoutMs: 5000 // 5 second timeout
    }
  });
  // the requested paywall
} catch (error) {
  console.error('Failed to fetch paywall:', 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><p>Подробнее о кодах локализаций и рекомендациях по их использованию читайте в разделе [Локализации и коды локалей](capacitor-localizations-and-locale-codes).</p> |
| **params.fetchPolicy** | <p>необязательный</p><p>по умолчанию: `'reload_revalidating_cache_data'`</p> | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует, что пользователи всегда получают самые актуальные данные.</p><p></p><p>Если у ваших пользователей нестабильный интернет, рассмотрите использование `'return_cache_data_else_load'` — тогда при наличии кеша он будет возвращён сразу. В таком сценарии данные могут быть не самыми свежими, но загрузка будет быстрее вне зависимости от качества соединения. Кеш обновляется регулярно, поэтому его безопасно использовать в течение сессии, чтобы сократить количество сетевых запросов.</p><p></p><p>Кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.</p> |
| **params.loadTimeoutMs** | <p>необязательный</p><p>по умолчанию: 5000 мс</p> | <p>Максимальное время ожидания (в миллисекундах) для этого метода. При его истечении будут возвращены кешированные данные или локальный резервный вариант.</p><p></p><p>Обратите внимание: в редких случаях метод может завершиться с небольшой задержкой относительно значения `loadTimeoutMs`, так как под капотом операция может включать несколько запросов.</p> |

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

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

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

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

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

```typescript showLineNumbers

try {
  const products = await adapty.getPaywallProducts({ paywall });
  // the requested products list
} catch (error) {
  console.error('Failed to fetch products:', error);
}
```

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

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

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

| Свойство                | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Title**               | Для отображения названия продукта используйте `product.localizedTitle`. Локализация основана на стране, выбранной пользователем в сторе, а не на локали устройства.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| **Price**               | Для отображения локализованной цены используйте `product.price?.localizedString` — локализация основана на локали устройства. Цену в числовом виде можно получить через `product.price?.amount` в местной валюте. Символ валюты доступен через `product.price?.currencySymbol`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| **Subscription Period** | Для отображения периода (неделя, месяц, год и т.д.) используйте `product.subscription?.localizedSubscriptionPeriod` — локализация основана на локали устройства. Для программного получения периода подписки используйте `product.subscription?.subscriptionPeriod`. Свойство `unit` возвращает единицу периода: `'day'`, `'week'`, `'month'`, `'year'` или `'unknown'`. Свойство `numberOfUnits` возвращает количество единиц. Например, для квартальной подписки `unit` будет `'month'`, а `numberOfUnits` — `3`.                                                                                                                                                                                                                                                                                                                                                                                       |
| **Introductory Offer**  | Чтобы показать значок или индикатор наличия introductory offer, проверьте свойство `product.subscription?.offer?.phases`. Это список, который может содержать до двух фаз скидки: бесплатный пробный период и фаза вводной цены. Каждый объект фазы содержит следующие полезные свойства:<br/>• `paymentMode`: строка со значениями `'free_trial'`, `'pay_as_you_go'`, `'pay_up_front'` и `'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-capacitor#fetch-paywall-information) выше.

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

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

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

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

```typescript showLineNumbers

try {
  const paywall = await adapty.getPaywallForDefaultAudience({ 
    placementId: 'YOUR_PLACEMENT_ID', 
    locale: 'en',
    params: {
      fetchPolicy: 'reload_revalidating_cache_data' // Load from server, fallback to cache
    }
  });
  // the requested paywall
} catch (error) {
  console.error('Failed to fetch default audience paywall:', error);
}
```

:::note
Метод `getPaywallForDefaultAudience` доступен начиная с версии Capacitor SDK 2.11.2.
:::

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