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

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

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

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

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

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

Пререквизит

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

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

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

  1. Создать загрузчик рекламы RewardedAdLoader и зарегистрировать обработчики событий загрузки рекламного объявления.
  2. Настроить параметры загрузки объявления AdRequestConfiguration
  3. Загрузить рекламу вызовом метода RewardedAdLoader.LoadAd(AdRequestConfiguration).
  4. Зарегистрировать обработчики событий взаимодействия пользователя с рекламным объявлением.
  5. Показать объявление вызовом метода RewardedAd.Show().
  6. Освободить ресурсы.

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

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

  2. Рекомендуется использовать один инстанс RewardedAdLoader для всех загрузок рекламных объявлений для улучшения производительности.

Пошаговая инструкция

  1. Создайте объект RewardedAdLoader в скрипте (на C#), который прикреплен к GameObject и зарегистрируйте обработчики событий загрузки рекламного объявления.

    using UnityEngine;
    using YandexMobileAds;
    using YandexMobileAds.Base;
    
    public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
    {
        private RewardedAdLoader rewardedAdLoader;
        private RewardedAd rewardedAd;
    
        private void SetupLoader()
        {
            rewardedAdLoader = new RewardedAdLoader();
            rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
            rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
            // ...
        }
    
        public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
        {
            // Rewarded ad was loaded successfully. Now you can handle it.
            rewardedAd = args.RewardedAd;
        }
    
        public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
        {
            // Ad {args.AdUnitId} failed for to load with {args.Message}
            // Attempting to load new ad from the OnAdFailedToLoad event is strongly discouraged.
        }
    }
    
  2. Настройте параметры загрузки объявления AdRequestConfiguration.

    string adUnitId = "demo-rewarded-yandex"; // замените на "R-M-XXXXXX-Y"
    AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
    

    adUnitId — уникальный идентификатор, который выдается в Партнерском интерфейсе и имеет следующий вид: R-M-XXXXXX-Y.

    Совет

    Для тестирования можете использовать ID демо блока: "demo-rewarded-yandex". Перед публикацией приложения обязательно замените его на ID настоящего рекламного блока.

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

  3. Загрузите рекламу вызовом метода LoadAd передав в качестве аргумента AdRequestConfiguration.

    rewardedAdLoader.LoadAd(adRequestConfiguration);
    
  4. Зарегистрируйте обработчики событий взаимодействия пользователя с рекламным объявлением.

    using System;
    
    // ...
    rewardedAd.OnAdClicked += HandleAdClicked;
    rewardedAd.OnAdShown += HandleAdShown;
    rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
    rewardedAd.OnAdImpression += HandleImpression;
    rewardedAd.OnAdDismissed += HandleAdDismissed;
    rewardedAd.OnRewarded += HandleRewarded;
    // ...
    
    public void HandleAdClicked(object sender, EventArgs args)
    {
        // Called when a click is recorded for rewarded ad.
    }
    
    public void HandleAdShown(object sender, EventArgs args)
    {
        // Called when an ad is shown.
    }
    
    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // Called when an ad failed to show.
    }
    
    public void HandleAdDismissed(object sender, EventArgs args)
    {
        // Called when an ad is dismissed.
    }
    
    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // Called when an impression is recorded for an ad.
    }
    
    public void HandleRewarded(object sender, Reward args)
    {
        // Called when the user can be rewarded with {args.type} and {args.amount}.
    }
    
  5. Покажите объявление вызовом метода Show() объекта RewardedAd.

    private void ShowRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Show();
        }
    }
    
  6. Вызывайте Destroy() у отработанных объявлений и очищайте ссылки, если они больше не используются на этом экране.

    Это освобождает используемые ресурсы и предотвращает утечки памяти.

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
    

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

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

Для проверки корректной интеграции 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

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

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

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

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

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

Важно

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

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

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

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

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

YMAMobileAds.enableLogging()

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

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

Советы

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

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

Вы можете вызвать загрузку в методе Awake для gameObject. При этом важно сохранить объект между сценами, с помощью вызова DontDestroyOnLoad(), для того чтобы загруженное объявление не удалялось вместе с gameObject при смене сцен.

private void Awake()
{
    SetupLoader();
    RequestRewardedAd();
    DontDestroyOnLoad(gameObject);
}

При этом к функциям обратного вызова на завершение показа или ошибки показа можно привязать загрузку следующего рекламного объявления. Например, так:

public void HandleAdFailedToShow(object sender, EventArgs args)
{
    // Called when an ad failed to show.

    // Clear resources after an ad dismissed.
    DestroyRewardedAd();

    // Now you can preload the next rewarded ad.
    RequestRewardedAd();
}

public void HandleAdDismissed(object sender, EventArgs args)
{
    // Called when an ad is dismissed.

    // Clear resources after an ad dismissed.
    DestroyRewardedAd();

    // Now you can preload the next rewarded ad.
    RequestRewardedAd();
}

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

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

Полный пример кода

using System;
using UnityEngine;
using UnityEngine.UI;
using YandexMobileAds;
using YandexMobileAds.Base;

public class YandexMobileAdsRewardedAdDemoScript : MonoBehaviour
{
    private RewardedAdLoader rewardedAdLoader;
    private RewardedAd rewardedAd;
    private Button button;

    private void Awake()
    {
        SetupLoader();
        RequestRewardedAd();
        DontDestroyOnLoad(gameObject);
        button.onClick.AddListener(ShowRewardedAd);
    }

    private void SetupLoader()
    {
        rewardedAdLoader = new RewardedAdLoader();
        rewardedAdLoader.OnAdLoaded += HandleAdLoaded;
        rewardedAdLoader.OnAdFailedToLoad += HandleAdFailedToLoad;
    }

    private void RequestRewardedAd()
    {
        string adUnitId = "demo-rewarded-yandex"; // замените на "R-M-XXXXXX-Y"
        AdRequestConfiguration adRequestConfiguration = new AdRequestConfiguration.Builder(adUnitId).Build();
        rewardedAdLoader.LoadAd(adRequestConfiguration);
    }

    private void ShowRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Show();
        }
    }

    public void HandleAdLoaded(object sender, RewardedAdLoadedEventArgs args)
    {
        // The ad was loaded successfully. Now you can handle it.
        rewardedAd = args.RewardedAd;

        // Add events handlers for ad actions
        rewardedAd.OnAdClicked += HandleAdClicked;
        rewardedAd.OnAdShown += HandleAdShown;
        rewardedAd.OnAdFailedToShow += HandleAdFailedToShow;
        rewardedAd.OnAdImpression += HandleImpression;
        rewardedAd.OnAdDismissed += HandleAdDismissed;
        rewardedAd.OnRewarded += HandleRewarded;
    }

    public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        // Ad {args.AdUnitId} failed for to load with {args.Message}
        // Attempting to load a new ad from the OnAdFailedToLoad event is strongly discouraged.
    }

    public void HandleAdDismissed(object sender, EventArgs args)
    {
        // Called when an ad is dismissed.

        // Clear resources after an ad dismissed.
        DestroyRewardedAd();

        // Now you can preload the next rewarded ad.
        RequestRewardedAd();
    }

    public void HandleAdFailedToShow(object sender, AdFailureEventArgs args)
    {
        // Called when rewarded ad failed to show.

        // Clear resources after an ad dismissed.
        DestroyRewardedAd();

        // Now you can preload the next rewarded ad.
        RequestRewardedAd();
    }

    public void HandleAdClicked(object sender, EventArgs args)
    {
        // Called when a click is recorded for an ad.
    }

    public void HandleAdShown(object sender, EventArgs args)
    {
        // Called when an ad is shown.
    }

    public void HandleImpression(object sender, ImpressionData impressionData)
    {
        // Called when an impression is recorded for an ad.
    }

    public void HandleRewarded(object sender, Reward args)
    {
        // Called when the user can be rewarded with {args.type} and {args.amount}.
    }

    public void DestroyRewardedAd()
    {
        if (rewardedAd != null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
    }
}

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