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

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

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

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

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

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

Пререквизит

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

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

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

  • Создать и настроить загрузчик рекламы RewardedAdLoader.
  • Зарегистрировать слушатель методов обратного вызова загрузки RewardedAdLoadListener.
  • Загрузить рекламу.
  • Зарегистрировать слушатель методов обратного вызова событий рекламного объявления RewardedAdEventListener.
  • Показать объявление RewardedAd.
  • Выдать пользователю награду за просмотр рекламы.

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

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

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

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

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

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

Для загрузки рекламы с вознаграждением необходимо создать и настроить RewardedAdLoader объект.

Для этого потребуется Activity или Application context.

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

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

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

После загрузки рекламного объявления (вызов метода onAdLoaded(rewardedAd: RewardedAd)) сохраните ссылку на загруженную рекламу RewardedAd до окончания показа.

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

class RewardedAdActivity : AppCompatActivity(R.layout.activity_rewarded_ad) {
    private var rewardedAd: RewardedAd? = null
    private var rewardedAdLoader: RewardedAdLoader? = null
    private lateinit var binding: ActivityRewardedAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRewardedAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Rewarded ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        rewardedAdLoader = RewardedAdLoader(this).apply {
            setAdLoadListener(object : RewardedAdLoadListener {
                override fun onAdLoaded(ad: RewardedAd) {
                    rewardedAd = ad
                    // The ad was loaded successfully. Now you can show loaded ad.
                }

                override fun onAdFailedToLoad(adRequestError: AdRequestError) {
                    // Ad failed to load with AdRequestError.
                    // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                }
            })
        }
        loadRewardedAd()
    }

    private fun loadRewardedAd() {
        val adRequestConfiguration = AdRequestConfiguration.Builder("your-ad-unit-id").build()
        rewardedAdLoader?.loadAd(adRequestConfiguration)
    }
}
public class RewardedAdActivity extends AppCompatActivity {
    @Nullable
    private RewardedAd mRewardedAd = null;
    @Nullable
    private RewardedAdLoader mRewardedAdLoader = null;
    private ActivityRewardedAdBinding mBinding;

    public RewardedAdActivity() {
        super(R.layout.activity_rewarded_ad);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityRewardedAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        // Ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        mRewardedAdLoader = new RewardedAdLoader(this);
        mRewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() {
            @Override
            public void onAdLoaded(@NonNull final RewardedAd rewardedAd) {
                mRewardedAd = rewardedAd;
                // The ad was loaded successfully. Now you can show loaded ad.
            }

            @Override
            public void onAdFailedToLoad(@NonNull final AdRequestError adRequestError) {
                // Ad failed to load with AdRequestError.
                // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
            }
        });
        loadRewardedAd();
    }

    private void loadRewardedAd() {
        if (mRewardedAdLoader != null ) {
            final AdRequestConfiguration adRequestConfiguration =
                new AdRequestConfiguration.Builder("your-ad-unit-id").build();
            mRewardedAdLoader.loadAd(adRequestConfiguration);
        }
    }
}

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

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

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

Для показа рекламного объявления потребуется передать Activity в метод show загруженного рекламного объявления:

private fun showAd() {
   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

           // Clean resources after Ad failed to show
               rewardedAd?.setAdEventListener(null)
               rewardedAd = null

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

           override fun onAdDismissed() {
               // Called when ad is dismissed.
               // Clean resources after Ad dismissed
               rewardedAd?.setAdEventListener(null)
               rewardedAd = null

               // 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(this@Activity)
   }
}
private void showAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(new RewardedAdEventListener() {
            @Override
            public void onAdShown() {
                // Called when ad is shown.
            }

            @Override
            public void onAdFailedToShow(@NonNull final AdError adError) {
                // Called when an ad failed to show.

                // Clean resources after Ad failed to show
              if (mRewardedAd != null) {
                  mRewardedAd.setAdEventListener(null);
                  mRewardedAd = null;
              }

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

            @Override
            public void onAdDismissed() {
                // Called when ad is dismissed.
                // Clean resources after Ad dismissed
                if (mRewardedAd != null) {
                    mRewardedAd.setAdEventListener(null);
                    mRewardedAd = null;
                }

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

            @Override
            public void onAdClicked() {
                // Called when a click is recorded for an ad.
            }

            @Override
            public void onAdImpression(@Nullable final ImpressionData impressionData) {
                // Called when an impression is recorded for an ad.
            }

            @Override
            public void onRewarded(@NonNull final Reward reward) {
                // Called when the user can be rewarded.
            }
        });
        mRewardedAd.show(this);
    }
}

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

Не храните ссылки на отработанные объявления. Вызывайте setAdEventListener(null) для отработанных объявлений. Вызывайте setAdLoadListener(null) у загрузчика, если он больше не используется. Это освобождает используемые ресурсы и предотвращает утечки памяти.

override fun onDestroy() {
    super.onDestroy()
    rewardedAdLoader?.setAdLoadListener(null)
    rewardedAdLoader = null
    destroyRewardedAd()
}

private fun destroyRewardedAd() {
    rewardedAd?.setAdEventListener(null)
    rewardedAd = null
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mRewardedAdLoader != null) {
        mRewardedAdLoader.setAdLoadListener(null);
        mRewardedAdLoader = null;
    }
    destroyRewardedAd();
}

private void destroyRewardedAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(null);
        mRewardedAd = 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

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

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