---
title: "Получение пейволов Paywall Builder и их конфигурации в Kotlin Multiplatform SDK"
description: "Узнайте, как получить PB-пейволы в Adapty для лучшего управления подписками в вашем Kotlin Multiplatform приложении."
---

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

Обратите внимание, что эта тема относится к пейволам, настроенным с помощью Paywall Builder. Если вы реализуете пейволы вручную, обратитесь к теме [Получение пейволов и продуктов для Remote Config пейволов в мобильном приложении](fetch-paywalls-and-products-kmp).

:::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>

## Получение пейвола, созданного с помощью Paywall Builder \{#fetch-paywall-designed-with-paywall-builder\}

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

Для оптимальной производительности важно получить пейвол и его [конфигурацию представления](kmp-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) как можно раньше, чтобы изображения успели загрузиться до того, как пейвол будет показан пользователю.

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

```kotlin showLineNumbers

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** | обязательный | Идентификатор нужного [плейсмента](placements). Это значение вы указали при создании плейсмента в дашборде Adapty. |
| **locale** | <p>необязательный</p><p>по умолчанию: `en`</p> | <p>Идентификатор [локализации пейвола](add-paywall-locale-in-adapty-paywall-builder). Ожидается языковой код из одного или двух подтегов, разделённых символом минус (**-**). Первый подтег — язык, второй — регион.</p><p></p><p>Пример: `en` — английский язык, `pt-br` — бразильский португальский.</p><p>Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе [Локализации и коды локалей](localizations-and-locale-codes).</p> |
| **fetchPolicy** | по умолчанию: `AdaptyPaywallFetchPolicy.Default` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует актуальность данных.</p><p></p><p>Однако если вы предполагаете, что у ваших пользователей нестабильное интернет-соединение, рассмотрите использование `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` — он возвращает кешированные данные, если они есть. В этом случае пользователи могут не получить самые свежие данные, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для сокращения сетевых запросов.</p><p></p><p>Кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.</p><p></p><p>Adapty SDK хранит пейволы локально в двух слоях: регулярно обновляемый кеш и [резервные пейволы](fallback-paywalls). Для ускорения загрузки используется CDN, а также отдельный резервный сервер на случай недоступности CDN. Эта система обеспечивает актуальность пейволов и надёжность даже при нестабильном интернет-соединении.</p> |
| **loadTimeout** | по умолчанию: 5 сек | <p>Ограничивает время ожидания для этого метода. Если таймаут истёк, будут возвращены кешированные данные или локальный резервный вариант.</p><p>Обратите внимание, что в редких случаях метод может завершиться чуть позже указанного в `loadTimeout` времени, так как операция может включать несколько запросов.</p><p>Для Kotlin Multiplatform: можно создать `TimeInterval` с помощью функций-расширений (например, `5.seconds`, где `.seconds` — из `import com.adapty.utils.seconds`) или `TimeInterval.seconds(5)`. Чтобы снять ограничение, используйте `TimeInterval.INFINITE`.</p> |

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

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

## Получение конфигурации представления пейвола, созданного с помощью Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\}

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

После получения пейвола проверьте, содержит ли он `ViewConfiguration` — это означает, что пейвол создан с помощью Paywall Builder. Результат проверки определяет способ отображения пейвола. Если `ViewConfiguration` присутствует, обрабатывайте его как пейвол Paywall Builder; если нет — [обрабатывайте как Remote Config пейвол](present-remote-config-paywalls-kmp).

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

```kotlin showLineNumbers

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`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) в [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/). Используйте его для настройки параметров покупки — например, персонализированных предложений или параметров обновления подписки для отдельных продуктов в пейволе. |

:::note
Если вы используете несколько языков, узнайте, как добавить [локализацию Paywall Builder](add-paywall-locale-in-adapty-paywall-builder).
:::

После загрузки [отобразите пейвол](kmp-present-paywalls).

## Получение пейвола для аудитории по умолчанию для ускорения загрузки \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\}

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

Для этого можно использовать метод `getPaywallForDefaultAudience`, который получает пейвол указанного плейсмента для аудитории **All Users**. Однако важно понимать, что рекомендованный подход — получать пейвол через метод `getPaywall`, как описано в разделе [Получение пейвола](#fetch-paywall-designed-with-paywall-builder) выше.

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

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

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

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

```kotlin showLineNumbers

Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the 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>Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе [Локализации и коды локалей](localizations-and-locale-codes).</p> |
| **fetchPolicy** | по умолчанию: `AdaptyPaywallFetchPolicy.Default` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует актуальность данных.</p><p></p><p>Однако если вы предполагаете, что у ваших пользователей нестабильное интернет-соединение, рассмотрите использование `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` — он возвращает кешированные данные, если они есть. В этом случае пользователи могут не получить самые свежие данные, но загрузка будет быстрее независимо от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для сокращения сетевых запросов.</p><p></p><p>Кеш сохраняется при перезапуске приложения и очищается только при переустановке или ручной очистке.</p> |

## Настройка ресурсов \{#customize-assets\}

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

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

Для остальных изображений и видео необходимо [задать пользовательский идентификатор](custom-media) в дашборде Adapty.

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

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

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

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

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

```kotlin showLineNumbers
// 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
    }
}
```

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