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

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

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

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

Внешний вид

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

Пререквизит

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

Для использования Compose расширения добавьте зависимость в build.gradle.kts:

dependencies {
    implementation("com.yandex.android:mobileads:8.0.0")
    implementation("com.yandex.android:mobileads-compose:8.0.0")

    // Compose BOM (минимум 2024.01.00)
    implementation(platform("androidx.compose:compose-bom:2025.03.00"))
}

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

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

  • Использовать rememberRewardedAdLoader() для создания загрузчика рекламы.
  • Загрузить рекламу через suspend-функцию loadAd() с обработкой результата RewardedAdLoadResult.
  • Зарегистрировать слушатель методов обратного вызова событий рекламного объявления RewardedAdEventListener.
  • Показать объявление RewardedAd.
  • Выдать пользователю награду за просмотр рекламы.

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

  1. Все вызовы методов Yandex Mobile Ads SDK необходимо выполнять из главного потока.

  2. Если вы получили ошибку в результате RewardedAdLoadResult.Failure, не пытайтесь загрузить новое объявление снова. Если всё же необходимо это сделать, ограничьте число повторных попыток загрузки рекламы. Это поможет избежать постоянных неудачных запросов и проблем с подключением в случае ограничений.

  3. Рекомендуется держать сильную ссылку на рекламу на всем протяжении жизни экрана, в рамках которого происходит взаимодействие с рекламой.

  4. Когда composable покидает дерево, cancelLoading() вызывается автоматически — явно освобождать ресурсы загрузчика не нужно.

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

Для загрузки рекламы с вознаграждением используйте rememberRewardedAdLoader(). Загрузка выполняется через suspend-функцию loadAd(), которая возвращает RewardedAdLoadResult.

Для загрузки рекламного объявления потребуется идентификатор рекламного места, полученный вами в интерфейсе Рекламной сети Яндекса (adUnitId).

Расширить параметры запроса за рекламой можно через AdRequestConfiguration.Builder(), передав в запросе данные об интересах пользователя, контекстные данные страницы, локацию или другие дополнительные данные. Дополнительные контекстные данные на запросе могут значительно улучшить качество рекламы. Подробнее читайте в разделе Таргетирование рекламы.

В следующем примере показано, как загрузить рекламу с вознаграждением:

import com.yandex.mobile.ads.common.AdRequestConfiguration
import com.yandex.mobile.ads.compose.rememberRewardedAdLoader
import com.yandex.mobile.ads.rewarded.RewardedAdLoadResult

@Composable
fun MyScreen(activity: Activity) {
    var rewardedAd by remember { mutableStateOf<RewardedAd?>(null) }

    val loader = rememberRewardedAdLoader()

    LaunchedEffect(Unit) {
        val adRequestConfiguration = AdRequestConfiguration.Builder("your-ad-unit-id").build()
        when (val result = loader.loadAd(adRequestConfiguration)) {
            is RewardedAdLoadResult.Success -> rewardedAd = result.ad
            is RewardedAdLoadResult.Failure -> {
                // Ad failed to load with AdRequestError.
                // Attempting to load a new ad from here is strongly discouraged.
            }
        }
    }
}

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

Rewarded-реклама — стимулирующий формат рекламы, который позволяет пользователю получить вознаграждение за просмотр рекламы. В качестве вознаграждения может быть дополнительная жизнь или переход на следующий уровень в игре. Формат вознаграждения определяется приложением.

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

Награда передаётся напрямую в коллбэк onRewarded при вызове метода show():

@Composable
fun MyScreen(activity: Activity) {
    var rewardedAd by remember { mutableStateOf<RewardedAd?>(null) }

    val loader = rememberRewardedAdLoader()

    LaunchedEffect(Unit) {
        val adRequestConfiguration = AdRequestConfiguration.Builder("your-ad-unit-id").build()
        when (val result = loader.loadAd(adRequestConfiguration)) {
            is RewardedAdLoadResult.Success -> rewardedAd = result.ad
            is RewardedAdLoadResult.Failure -> {
                // Ad failed to load with AdRequestError.
            }
        }
    }

    LaunchedEffect(rewardedAd) {
        rewardedAd?.apply {
            setAdEventListener(object : RewardedAdEventListener {
                override fun onAdShown() {
                    // Called when ad is shown.
                }

                override fun onAdFailedToShow(adError: AdError) {
                    // Called when an RewardedAd failed to show.
                    // Now you can preload the next rewarded ad.
                    loadRewardedAd()
                }

                override fun onAdDismissed() {
                    // Called when ad is dismissed.
                    // Now you can preload the next rewarded ad.
                    loadRewardedAd()
                }

                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) {
                    // Called when the user can be rewarded.
                }
            })
            show(activity)
        }
    }
}

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

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

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

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

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

Важно

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

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

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

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

Данный инструмент проверяет корректность подключения rewarded рекламы и выводит в лог подробный отчет. Для просмотра отчета, выполните поиск по ключевому слову "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

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

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