Реклама с вознаграждением

Реклама с вознаграждением — популярный полноэкранный формат объявления, за просмотр которого пользователь получает поощрение.

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

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

Внешний вид

Это руководство покажет, как интегрировать рекламу с вознаграждением в приложение на Compose Multiplatform. В дополнение к примерам кода и инструкции, оно также содержит рекомендации по использованию данного формата рекламы, а также ссылки на дополнительные ресурсы.

Пререквизит

  1. Выполните шаги по интеграции Yandex Mobile Ads Compose Multiplatform Plugin, описанные в Быстром старте.
  2. Убедитесь, что используете самую актуальную версию Yandex Mobile Ads Compose Multiplatform Plugin, а в случае использовании медиации — наиболее свежую версию единой сборки.

Имплементация

Основные шаги по интеграции рекламы с вознаграждением:

  1. Создайте загрузчик рекламы с помощью rememberRewardedAdLoader().
  2. Загрузить рекламу через suspend-функцию loadAd().
  3. При необходимости установите RewardedAdEventListener на загруженное объявление перед вызовом show().
  4. Покажите рекламу используя метод show().

Особенности подключения рекламы с вознаграждением

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

Загрузка рекламы

Используйте rememberRewardedAdLoader() и loadAd с AdRequest, где указан adUnitId из интерфейса Рекламной сети Яндекса.

Запрос расширяйте через AdRequest (targeting, parameters, preferredTheme и т. д.). Дополнительный контекст улучшает качество рекламы. Подробнее — в разделе Таргетирование рекламы.

Пример загрузки:

@Composable
fun RewardedBlock(adUnitId: String) {
    val loader = rememberRewardedAdLoader()
    val scope = rememberCoroutineScope()
    var rewardedAd by remember { mutableStateOf<RewardedAd?>(null) }
    var isLoading by remember { mutableStateOf(false) }

    Button(
        onClick = {
            isLoading = true
            scope.launch {
                try {
                    rewardedAd = loader.loadAd(AdRequest(adUnitId = adUnitId))
                } catch (e: Exception) {
                    // Ad failed to load with AdRequestError.
                    // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                }
                isLoading = false
            }
        },
        enabled = !isLoading,
    ) {
        Text(if (isLoading) "Загрузка..." else "Загрузить с вознаграждением")
    }

    Button(
        onClick = {
            rewardedAd?.show()
            rewardedAd = null
        },
        enabled = rewardedAd != null,
    ) {
        Text("Показать с вознаграждением")
    }
}

Для отладки подойдёт adUnitId 'demo-rewarded-yandex'.

Показ объявления

Реклама с вознаграждением — стимулирующий формат: пользователь получает награду за просмотр (дополнительная жизнь, переход на уровень и т. п.). Конкретную награду определяет приложение.

Чтобы отслеживать жизненный цикл и выдавать награду, перед show() установите на RewardedAd слушатель RewardedAdEventListener.

val ad = rewardedAd ?: return
ad.setAdEventListener(
    object : RewardedAdEventListener {
        override fun onAdShown() {
            // Called when an ad is shown.
        }

        override fun onAdFailedToShow(adError: AdError) {
            // Called when an ad failed to show.
        }

        override fun onAdDismissed() {
            // Called when ad is dismissed. Preload the next rewarded ad if appropriate.
        }

        override fun onAdClicked() {
            // Called when a click is recorded for an ad.
        }

        override fun onAdImpression(impressionData: ImpressionData?) {
            // Called when an impression is recorded for an ad.
        }

        override fun onRewarded(reward: Reward) {
            // Grant currency: reward.type, reward.amount
        }
    },
)
ad.show()

Освобождение ресурсов

После onAdDismissed или onAdFailedToShow сбрасывайте ссылки и при необходимости загружайте следующий креатив. Не храните сильные ссылки на уже показанные объявления.

Тестирование интеграции рекламы с вознаграждением

Использование демоблоков для тестирования рекламы

Для проверки корректной интеграции rewarded-объявлений и тестирования приложения используйте тестовую рекламу. Для гарантированного возврата тестовых объявлений на каждый запрос за рекламой вы можете использовать специальный демонстрационный идентификатор рекламного места.

Демонстрационный adUnitId: demo-rewarded-yandex.

Важно

Убедитесь, что перед выкладыванием приложения в магазин вы заменили демонстрационный идентификатор рекламного места на настоящий, полученный в интерфейсе Рекламной сети Яндекса.

Список всех доступных демонстрационных идентификаторов рекламного места доступен в разделе Демоблоки для тестирования.

Проверка корректной интеграции рекламы

Проверить корректность интеграции рекламы с вознаграждением можно через встроенный в SDK анализатор. Подробный отчет о проверке выведется в лог.

Для просмотра отчета, выполните поиск по ключевому слову YandexAds в инструменте отладки Android-приложений Logcat.

adb logcat -v brief '*:S YandexAds'

В случае успешной интеграции вы увидите следующее сообщение:

adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type rewarded was integrated successfully

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

Использование демоблоков для тестирования рекламы

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

Демонстрационный adUnitId: demo-rewarded-yandex.

Важно

Убедитесь, что перед выкладыванием приложения в магазин вы заменили демонстрационный идентификатор рекламного места на настоящий, полученный в интерфейсе Рекламной сети Яндекса.

Список всех доступных демонстрационных идентификаторов рекламного места доступен в разделе Демоблоки для тестирования.

Проверка корректной интеграции рекламы

Проверить корректность интеграции рекламы можно через нативный инструмент Console.

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

YandexAds.enableLogging()

Для просмотра логов SDK в инструменте Console установите Subsystem = com.mobile.ads.ads.sdk. Вы можете фильтровать логи по категории и уровню ошибки.

В случае обнаружения проблем при интеграции рекламы вы увидите подробный отчет о проблемах и рекомендации по их устранению.

Советы

Предзагрузка объявления

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

Вызывайте loadAd заранее и в нужный момент сразу показывайте загруженное объявление.

Чтобы начать загрузку следующего объявления сразу после показа текущего, свяжите этот процесс с событием onAdDismissed.

Избыточное кеширование объявлений на экранах, которые вряд ли будут показаны, может снизить эффективность рекламы. Например, если в среднем пользователи проходят 2–3 уровня игры за раз, не стоит кешировать объявления для 6–7 экранов. Так видимость рекламы снизится, и рекламная система может деприоритизировать приложение.

Чтобы кеширование работало на пользу приложения, обращайте внимание на метрику «Доля показов» или «Доля видимых показов» в интерфейсе Рекламной сети Яндекса. Если она ниже 20%, это повод задуматься над изменением алгоритма кеширования. Чем доля показов выше, тем лучше.

Дополнительные ресурсы