Получение пейволов Paywall Builder и их конфигурации в Flutter SDK

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

Новый Paywall Builder работает с Flutter SDK версии 3.3.0 и выше.

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

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

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

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

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

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

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

try {
  final paywall = await Adapty().getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en");
  // the requested paywall
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
}

Параметры:

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

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

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

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

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

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

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

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

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

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

Adapty SDK хранит пейволы локально на двух уровнях: регулярно обновляемый кэш и резервные пейволы. Для ускорения загрузки используется 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

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

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


try {
  final view = await AdaptyUI().createPaywallView(
        paywall: paywall,
      );
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

Получив представление, отобразите пейвол.

Получение пейвола для аудитории по умолчанию (ускоренный способ)

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

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

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

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

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

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

try {
    final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
} on AdaptyError catch (adaptyError) {
    // handle error
} catch (e) {
    // handle unknown error
}

Метод getPaywallForDefaultAudience доступен начиная с Flutter SDK версии 3.2.0.

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

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

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

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

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

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

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

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

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

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

Настройка пользовательских ресурсов

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

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

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

Например, можно:

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

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

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


final customAssets = {
    // Show a local image using a custom ID
    'custom_image': AdaptyCustomAsset.localImageAsset(
        assetId: 'assets/images/image_name.png',
    ),

    // Show a local video with a preview image
    'hero_video': AdaptyCustomAsset.localVideoAsset(
        assetId: 'assets/videos/custom_video.mp4',
    ),
};

try {
    final view = await AdaptyUI().createPaywallView(
        paywall: paywall,
        customAssets: <CUSTOM_ASSETS>,
        preloadProducts: preloadProducts,
        );
    } on AdaptyError catch (e) {
        // handle the error
    } catch (e) {
// handle the error
}

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

Настройка таймеров, заданных разработчиком

Чтобы использовать пользовательские таймеры в мобильном приложении, создайте объект, реализующий протокол AdaptyTimerResolver. Этот объект определяет, как должен отображаться каждый пользовательский таймер. При желании можно напрямую использовать словарь [String: Date], поскольку он уже соответствует этому протоколу. Пример:


try {
  final view = await AdaptyUI().createPaywallView(
        paywall: paywall,
        customTimers: {
          'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)),
          'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025
        },
      );
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

В этом примере CUSTOM_TIMER_NY и CUSTOM_TIMER_6H — это Timer ID таймеров, заданных разработчиком в дашборде Adapty. timerResolver обеспечивает динамическое обновление каждого таймера с правильным значением. Например:

  • CUSTOM_TIMER_NY: время до окончания таймера, например до Нового года.
  • CUSTOM_TIMER_6H: оставшееся время шестичасового периода, начавшегося с момента открытия пейвола пользователем.