Переход на новый SDK Google Mobile Ads C++


В выпуске Firebase C++ SDK v9.1.0 представлен новый Google Mobile Ads C++ SDK.

Google Mobile Ads C++ SDK — это новая API-поверхность, включающая в себя основные изменения, внесенные в Firebase AdMob C++ SDK для iOS и Android в 2021 и 2022 годах, включая удаление устаревших API и новый поток при работе с полноэкранными типами рекламы.

Старый Firebase AdMob C++ SDK ( firebase::admob ) был помечен как устаревший и в дальнейшем не будет получать никаких обновлений или исправлений ошибок.

Как новый Google Mobile Ads C++ SDK ( firebase::gma ), так и старый Firebase AdMob C++ SDK ( firebase::admob ) останутся частью архивов сборки Firebase C++ SDK в течение периода устаревания Firebase AdMob C++ SDK.

Удаление устаревшего API

Следующие API были полностью удалены из Google Mobile Ads C++ SDK.

RewardedVideoAd

Пространство имён RewardedVideoAd в AdMob заменено классом RewardedAd . RewardedAd ведёт себя аналогично InterstitialAd , но включает дополнительный RewardedAdListener для получения уведомлений о наградах за товары.

NativeExpressAds

NativeExpressAd от AdMob уже был отмечен как устаревший в каждом пакете Firebase AdMob C++ SDK. Поэтому NativeExpressAd не включён в новый пакет Google Mobile Ads C++ SDK.

Изменение пространства имен SDK

SDK перенесен в новое пространство имен и имеет новую структуру каталогов:

Пространство имен firebase::gma

Исходный код нового Google Mobile Ads C++ SDK находится в пространстве имён firebase::gma . Старое пространство имён firebase::admob устарело вместе с Firebase AdMob C++ SDK.

Структура каталога

Заголовочные файлы перемещены в новый каталог внутри архива сборки:

Устаревший Firebase AdMob C++ SDK Новый C++ SDK для Google Mobile Ads
include/firebase/admob include/firebase/gma

Библиотека

Firebase AdMob C++ SDK будет предоставлен как статическая библиотека в архиве сборки Firebase C++ SDK:

iOS

Устаревший Firebase AdMob C++ SDK Новый C++ SDK для Google Mobile Ads
firebase_admob.xcframework firebase_gma.xcframework

Андроид

Устаревший Firebase AdMob C++ SDK Новый C++ SDK для Google Mobile Ads
libfirebase_admob.a libfirebase_gma.a

Миграции классов, перечислений и структур

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

  • BannerView переименован в AdView .
  • NativeAdExpressView удален.
  • Пространство имен RewardedVideo заменяется классом RewardedAd .
  • Перечисление и прослушиватели PresentationState удаляются и заменяются прослушивателями AdListener и FullScreenContent .
  • Следующие параметры удаляются из параметров конфигурации отдельных объявлений в AdRequests :

    • конфигурация идентификаторов тестовых устройств
    • таргетинг рекламы по возрасту

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

Устаревшее firebase::admob namespace Новое firebase::gma namespace
AdSizeType (перечисление) AdSize::Type (перечисление)
BannerView AdView
BannerView::Listener AdListener
AdViewBoundingBoxListener
PaidEventListener
BannerView::Position AdView::Position
BannerView::PresentationState Удаленный
ChildDirectedTreatmentState RequestConfiguration::TagForChildDirectedTreatment
Gender (перечисление) Удаленный
InterstitialAd::Listener FullScreenContentListener
PaidEventListener
KeyValuePair Удаленный
NativeExpressAdView Удаленный
PollableRewardListener Удаленный
RewardItem AdReward
RewardedVideoAd (пространство имен) RewardedAd (класс)
RewardedVideoAd::Listener FullScreenContentListener
PaidEventListener
UserEarnedRewardListener
AdMobError (перечисление) AdErrorCode (перечисление)
RewardItem AdReward

Инициализация SDK

Каждая функция инициализации Google Mobile Ads C++ SDK немедленно возвращает два индикатора состояния:

  • Необязательный параметр out сообщает, произошла ли ошибка зависимости до начала процесса инициализации.

  • Возвращаемый параметр — это ссылка на firebase::Future . Future содержит результаты асинхронной инициализации адаптеров-посредников на устройстве.

Хотя Google Mobile Ads C++ SDK может быть вызван для загрузки рекламы AdMob сразу после возврата функции инициализации, другие рекламные сети не будут показывать рекламу до полной инициализации соответствующего адаптера-медиатора. Этот процесс происходит асинхронно. Поэтому, если вы используете рекламную медиацию в своём приложении, мы рекомендуем дождаться разрешения Future , прежде чем пытаться загрузить какие-либо объявления.

До

firebase::App* app = ::firebase::App::Create();
firebase::InitResult result = firebase::admob::Initialize(*app, kAdMobAppID);

if (result != kInitResultSuccess) {
  // Initialization immediately failed, most likely due to a missing dependency.
  // Check the device logs for more information.
  return;
}

После

using firebase::App;
using firebase::Future;
using firebase::gma::AdapterInitializationStatus;

App* app = ::firebase::App::Create();
firebase::InitResult result;
Future<AdapterInitializationStatus> future =
  firebase::gma::Initialize(*app, &result);

if (result != kInitResultSuccess) {
  // Initialization immediately failed, most likely due to a missing dependency.
  // Check the device logs for more information.
  return;
}

// Poll the future to wait for its completion either in this
// thread, or as part of your game loop by calling
// firebase::gma::InitializeLastResult();
while (future.status() == firebase::kFutureStatusPending) {
  // Initialization on-going, continue to wait.
}

// future.status() is either kFutureStatusComplete or there’s an error

if (future.status() == firebase::kFutureStatusComplete &&
     future.error() == firebase::gma::AdErrorCodeNone) {
  AdapterInitializationStatus* status = future.result();
  // Check status for any mediation adapters you wish to use.
  // ..
} else {
  // Handle initialization error.
}

Изменения AdSize в AdView

AdSize теперь содержит статические элементы распространенных размеров баннерной рекламы и поддерживает размеры рекламы AnchorAdaptive и InlineAdaptive , которые имеют динамическую высоту, основанную на заданной ширине и текущей ориентации экрана.

Статические константы AdSize добавлены в firebase::gma::AdSize

AdSize::kBanner

Размер баннерной рекламы Ассоциации мобильного маркетинга (MMA) (320x50 пикселей, не зависящих от плотности)

AdSize::kFullBanner

Полный размер баннера Бюро интерактивной рекламы (IAB) (468x60 пикселей, не зависящих от плотности)
AdSize::kLargeBanner Более высокая версия kBanner , обычно 320x100

AdSize::kLeaderboard

Размер рекламного баннера Interactive Advertising Bureau (IAB) (728x90 пикселей, не зависящих от плотности)
AdSize::kMediumRectangle Средний размер прямоугольной рекламы Interactive Advertising Bureau (IAB) (300x250 пикселей, не зависящих от плотности)
Статические методы в firebase::gma::AdSize для создания экземпляров AdSize
GetLandscapeAnchoredAdaptiveBannerAdSize Создает AdSize с заданной шириной и оптимизированной Google высотой для создания баннерной рекламы в альбомной ориентации.
GetPortraitAnchoredAdaptiveBannerAdSize Создает AdSize с заданной шириной и оптимизированной Google высотой для создания баннерной рекламы в портретном режиме.
GetCurrentOrientationAnchoredAdaptiveBannerAdSize Создает AdSize с заданной шириной и оптимизированной Google высотой для создания баннерной рекламы с учетом текущей ориентации.
GetInlineAdaptiveBannerAdSize Создает AdSize , наиболее подходящий для баннерной рекламы с учетом максимальной высоты

Этот AdSize позволяет серверам Google выбирать оптимальный размер объявления с высотой, меньшей или равной указанной максимальной высоте.

GetLandscapeInlineAdaptiveBannerAdSize Создает InlineAdaptive AdSize с заданной шириной и высотой в альбомной ориентации устройства.
GetPortraitInlineAdaptiveBannerAdSize Создает InlineAdaptive AdSize с заданной шириной и высотой портрета устройства.
GetCurrentOrientationInlineAdaptiveBannerAdSize Удобный метод для возврата InlineAdaptive AdSize с учетом текущей ориентации интерфейса и определенной ширины.

До

firebase::admob::BannerView* banner_view = new firebase::admob::BannerView();

firebase::admob::AdSize ad_size;
ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
ad_size.width = 320;
ad_size.height = 50;

// ad_parent is a reference to an iOS UIView or an Android Activity.
// banner_ad_unit is your ad unit id for banner ads.
banner_view->Initialize(ad_parent, banner_ad_unit, ad_size);

После

firebase::gma::AdView* ad_view = new firebase::gma::AdView();

// ad_parent is a reference to an iOS UIView or an Android Activity.
// banner_ad_unit is your ad unit id for banner ads.
banner_view->Initialize(ad_parent, banner_ad_unit, firebase::gma::AdSize.kBanner);

AdRequest и глобальная конфигурация

Идентификаторы тестовых устройств TagForChildDirectedTreatment и TagForUnderAgeOfConsent (ранее обрабатывавшиеся по дате рождения) удалены из AdRequest и теперь являются частью глобального RequestConfiguration . Приложения могут вызывать firebase::gma::SetRequestConfiguration() на ранних этапах жизненного цикла приложения для настройки этих значений. Все последующие операции загрузки рекламы будут учитывать эти настройки после их настройки.

firebase::gma::AdRequest все еще существует, поскольку он предоставляет контекстную информацию для загрузки рекламы, включая ключевые слова и необязательный URL-адрес контента.

Структура AdRequest в стиле C от AdMob была заменена классом с методами, которые обеспечивают лучший пользовательский интерфейс при определении и добавлении в различные списки информации.

Вот примечательные изменения AdRequest :

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

До

firebase::admob::AdRequest request;

// Keywords to be used in targeting.
const char* keywords[] = {"GMA", "C++", "Fun"};
request.keyword_count = sizeof(keywords) / sizeof(keywords[0]);
request.keywords = keywords;

// "Extra" key value pairs.
static const firebase::admob::KeyValuePair extras[] = {
      {"extra_name", "extra_value"}};
request.extras_count = sizeof(extras) / sizeof(extras[0]);
request.extras = kRequestExtras;

// Devices that should be served test ads.
const char* test_device_ids[] ={ "123", "4567", "890" };
request.test_device_id_count =
      sizeof(test_device_ids) / sizeof(test_device_ids[0]);
request.test_device_ids = test_device_ids;

// Sample birthday to help determine the age of the user.
request.birthday_day = 10;
request.birthday_month = 11;
request.birthday_year = 1975;

// Load Ad with the AdRequest.

После

// Do once after Google Mobile Ads C++ SDK initialization.
// These settings will affect all Ad Load operations.
firebase::gma::RequestConfiguration configuration;
configuration.max_ad_content_rating =
      firebase::gma::RequestConfiguration::kMaxAdContentRatingPG;
configuration.tag_for_child_directed_treatment =
      firebase::gma::RequestConfiguration::kChildDirectedTreatmentTrue;
configuration.tag_for_under_age_of_consent =
      firebase::gma::RequestConfiguration::kUnderAgeOfConsentFalse;
configuration.test_device_ids.push_back("1234");
configuration.test_device_ids.push_back("4567");
configuration.test_device_ids.push_back("890");
firebase::gma::SetRequestConfiguration(configuration);

// Then, more information must be provided via an AdRequest when
// loading individual ads.
firebase::gma::AdRequest ad_request;

// "Extra" key value pairs.
ad_request.add_keyword("GMA");
ad_request.add_keyword("C++");
ad_request.add_keyword("Fun");

// Content URL.
ad_request.set_content_url("www.example.com");

// Mediation Adapter Extras.
#if defined(Android)
const char* ad_network_extras_class_name =
    "com/google/ads/mediation/admob/AdMobAdapter";
#else  // iOS
const char* ad_network_extras_class_name = "GADExtras";
#endif

ad_request.add_extra(ad_network_extras_class_name, "extra_name", "extra_value");

// Load Ad with the AdRequest. See next section.

AdResults

LoadAd теперь возвращает Future , содержащий объект AdResult для всех типов объявлений AdView , InterstitialAd и RewardedAd . Метод AdResult::is_successful возвращает true если запрос объявления был успешно выполнен, или false в противном случае.

В случае сбоя AdResult содержит объект AdError с информацией о проблеме на уровне обслуживания, включая код ошибки, сообщение об ошибке и строки домена.

До

firebase::Future<AdResult> future;

void load_ad() {
  // Assume an already created AdRequest object.
  future = ad_view->LoadAd(ad_request);
}

void your_game_loop() {
  if (future.status() == firebase::kFutureStatusComplete) {
    if(future.error() != firebase::admob::kAdMobErrorNone) {
      // There was either an internal SDK issue that caused the Future to
      // fail its completion, or AdMob failed to fulfill the ad request.
      // Details are unknown other than the Future’s error code returned
      // from future.error().
    } else {
      // The ad loaded successfully.
    }
  }
}

После

firebase::Future<AdResult> future;

void load_ad() {
  // Assumes a previously created AdRequest object.
  // See "AdRequest and Global Configuration" above.
  future = ad_view->LoadAd(ad_request);
}

void your_game_loop() {
  // Check the future status in your game loop:
  if (future.status() == firebase::kFutureStatusComplete) {
    if(future.error() != firebase::admob::kAdErrorCodeNone) {
      // There was an internal SDK issue that caused the Future to fail.
    } else {
      // Future completed successfully.  Check the GMA result.
      const AdResult* ad_result = future.result();
      if ( ad_result->is_successful() != true ) {
        // GMA failed to serve an ad. Gather information about the error.
        const AdError& ad_error = ad_result->ad_error();
        AdErrorCode error_code = ad_error.code();
        const std::string error_domain = ad_error.domain();
        const std::string error_message = ad_error.message();
      } else {
        // The ad loaded successfully.
      }
    }
  }
}

События AdListener в AdView

BannerView::Listener AdMob был заменен двумя отдельными классами прослушивателей в Google Mobile Ads C++ SDK:

  • AdListener отслеживает жизненный цикл рекламы и события взаимодействия с пользователем.
  • AdViewBoundingBoxListener вызывается при изменении размера или перемещении AdView .

Сопоставления Google Mobile Ads с обратным вызовом AdMob OnPresentationStateChanged

Перечислимый тип firebase::admob::BannerView::PresentationState и метод прослушивателя OnPresentationStateChanged не включены в новый Google Mobile Ads C++ SDK.

Ниже приведены альтернативные способы обнаружения изменений состояния презентации в жизненном цикле AdView :

firebase::admob::BannerView::Listener OnPresentationStateChanged firebase::gma::AdListener аналог
kPresentationStateHidden При вызове AdListener::OnAdClosed или при успешном завершении асинхронной операции AdView::Hide()
kPresentationStateVisibleWithoutAd Нет. Попытка вызвать AdView::Show() для незагруженного AdView приведёт к ошибке.
kPresentationStateVisibleWithAd Когда вызывается AdListener::OnAdOpened или когда AdView::Show() успешно завершает свою асинхронную операцию с рекламой
kPresentationStateOpenedPartialOverlay Запросите ограничивающий блок после AdListener::OnAdOpened() чтобы определить размер и положение показываемого объявления. В качестве альтернативы, запросите положение и AdSize AdView и/или отслеживайте ограничивающий блок с помощью AdViewBoundingBoxListener .
kPresentationStateCoveringUI См. kPresentationStateOpenedPartialOverlay выше.

RewardedAd теперь является классом

Устаревший Firebase AdMob C++ SDK обеспечивал показ объявлений с вознаграждением посредством набора функций в пространстве имён firebase::admob::rewarded_ad . Эти функции были объединены в новый класс RewardedAd , который обслуживает рекламу с API, аналогичным InterstitialAd (см. следующий раздел).

Слушатели InterstitialAd и RewardedAd

Полноэкранной рекламой считаются как полноэкранные объявления, так и объявления с вознаграждением. Для отслеживания событий жизненного цикла рекламы этих типов можно установить новый FullScreenContentListener , а для отслеживания того, когда сервис AdMob считает событие платным, можно установить отдельный PaidEventListener .

RewardedAd имеет дополнительный прослушиватель для отслеживания событий вознаграждения пользователя.

Новые методы обратного вызова полноэкранной рекламы

Методы FullScreenContentListener Методы PaidEventListener Методы UserEarnedRewardListener
OnAdClicked OnPaidEvent OnUserEarnedReward
OnAdDismissedFullScreenContent
OnAdFailedToShowFullScreenContent
OnAdImpression
OnAdShowedFullScreenContent

Методы изменены/удалены/заменены

В таблице ниже перечислены методы, изменённые в новом C++ SDK Google Mobile Ads. Методы с перечисленными параметрами остались, но их сигнатуры изменились.

Сорт API Firebase AdMob C++ SDK API C++ SDK для мобильных объявлений Google Примечания
BannerView MoveTo AdView::SetPosition
presentation_state Удаленный Обрабатывается событиями AdViewListener и будущими результатами AdView::Show и AdView::Hide .
SetListener AdView::SetAdListener
AdView::SetBoundingBoxListener
AdView::SetPaidEventListener
Новый дизайн прослушивателя повышает точность обнаружения событий жизненного цикла AdView .
Listener::OnPresentationStateChanged Удаленный См. BannerView::SetListener выше.
Listener::OnBoundingBoxChanged AdViewBoundingBoxListener::OnBoundingBoxChanged
InterstitialAd Initialize(AdParent parent, const char* ad_unit_id) Initialize(AdParent parent) Параметр ad_unit_id теперь является частью операции LoadAd .
LoadAd(const AdRequest& request) LoadAd(const char* ad_unit_id, const AdRequest& request)
presentation_state Удаленный Перечисление presentation_state удалено. Используйте FullScreenContentListener .
SetListener SetFullScreenContentListener
SetPaidEventListener
Destroy Удаленный Очистка ресурсов теперь является частью деструктора RewardedAd .
RewardedAd
(формально
RewardedVideoAd )
Initialize Initialize(AdParent parent) AdParent ранее передавался в Show , но теперь является частью инициализации.
presentation_state Удаленный Перечисление presentation_state удалено. Используйте FullScreenContentListener .
SetListener SetFullScreenContentListener
SetPaidEventListener Show
При показе RewardedAd также определяется прослушиватель UserEarnedReward . См. ниже.
Show(AdParent parent) Show(UserEarnedRewardListener* listener)