В версии 9.1.0 Firebase C++ SDK представлен новый C++ SDK для мобильной рекламы Google.
Google Mobile Ads C++ SDK — это новый API-интерфейс, который включает в себя основные изменения, внесенные в Firebase AdMob C++ SDK для iOS и Android в 2021 и 2022 годах, в том числе удаление устаревших API и новый алгоритм работы с полноэкранными типами рекламы.
Старый C++ SDK Firebase AdMob ( firebase::admob ) помечен как устаревший и больше не будет получать никаких обновлений или исправлений ошибок.
Как новый C++ SDK для Google Mobile Ads ( firebase::gma ), так и старый C++ SDK для Firebase AdMob ( firebase::admob ) останутся частью архивов сборки для C++ SDK Firebase во время периода прекращения поддержки C++ SDK Firebase AdMob.
Удаление устаревшего API
Следующие API были полностью удалены из SDK Google Mobile Ads C++.
RewardedVideoAd
Пространство имен RewardedVideoAd в AdMob заменено классом RewardedAd . RewardedAd ведет себя аналогично классу InterstitialAd , но включает дополнительный RewardedAdListener для получения уведомлений о вознаграждениях.
NativeExpressAds
В каждом SDK Firebase AdMob для C++ компонент NativeExpressAd уже был помечен как устаревший. Поэтому NativeExpressAd не включен в новый SDK Google Mobile Ads для C++.
изменение пространства имен SDK
SDK переместился в новое пространство имен и получил новую структуру каталогов:
Пространство имен firebase::gma
Исходный код нового SDK Google Mobile Ads на C++ находится в пространстве имен firebase::gma . Более старое пространство имен firebase::admob устарело вместе с SDK Firebase AdMob на C++.
Структура каталогов
Заголовочные файлы перемещены в новую директорию внутри архива сборки:
| Устаревший C++ SDK для Firebase AdMob | Новый SDK Google для мобильной рекламы на C++ |
|---|---|
include/firebase/admob | include/firebase/gma |
Библиотека
Пакет SDK Firebase AdMob для C++ будет предоставлен в виде статической библиотеки в архиве сборки SDK Firebase C++ :
iOS
| Устаревший C++ SDK для Firebase AdMob | Новый SDK Google для мобильной рекламы на C++ |
|---|---|
firebase_admob.xcframework | firebase_gma.xcframework |
Android
| Устаревший C++ SDK для Firebase AdMob | Новый SDK Google для мобильной рекламы на C++ |
|---|---|
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 (enum) |
BannerView | AdView |
BannerView::Listener | AdListenerAdViewBoundingBoxListenerPaidEventListener |
BannerView::Position | AdView::Position |
BannerView::PresentationState | Удаленный |
ChildDirectedTreatmentState | RequestConfiguration::TagForChildDirectedTreatment |
Gender (перечисление) | Удаленный |
InterstitialAd::Listener | FullScreenContentListenerPaidEventListener |
KeyValuePair | Удаленный |
NativeExpressAdView | Удаленный |
PollableRewardListener | Удаленный |
RewardItem | AdReward |
RewardedVideoAd (пространство имен) | RewardedAd (класс) |
RewardedVideoAd::Listener | FullScreenContentListenerPaidEventListenerUserEarnedRewardListener |
AdMobError (enum) | AdErrorCode (enum) |
RewardItem | AdReward |
Инициализация SDK
Каждая функция инициализации Google Mobile Ads C++ SDK немедленно возвращает два индикатора состояния:
Необязательный выходной параметр указывает, произошла ли ошибка зависимостей до начала процесса инициализации.
Возвращаемый параметр представляет собой ссылку на
firebase::Future.Futureсодержит результаты асинхронной инициализации адаптеров посредничества на устройстве.
Хотя SDK Google Mobile Ads на C++ может быть вызван для загрузки рекламы, показываемой 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 , которые имеют динамическую высоту, зависящую от заданной ширины и текущей ориентации экрана.
В firebase::gma::AdSize добавлены статические константы AdSize | |
|---|---|
AdSize::kBanner | Размер баннерной рекламы по стандартам Ассоциации мобильного маркетинга (MMA) (320x50 пикселей, не зависящих от плотности). |
AdSize::kFullBanner | Полноразмерный баннер рекламного объявления Interactive Advertising Bureau (IAB) (468x60 пикселей, не зависящих от плотности). |
AdSize::kLargeBanner | Более высокая версия kBanner , обычно 320x100. |
AdSize::kLeaderboard | Размер рекламного объявления в формате Leaderboard от 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 наиболее подходящий для баннерной рекламы, с учетом максимальной высоты. |
GetLandscapeInlineAdaptiveBannerAdSize | Создает адаптивный встроенный AdSize 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-адрес контента.
В AdMob структура AdRequest в стиле C была заменена классом с методами, обеспечивающими более удобный интерфейс при определении и добавлении информации в различные списки.
Вот основные изменения 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
В SDK Google Mobile Ads на C++ класс BannerView::Listener из AdMob был заменен двумя отдельными классами слушателей:
-
AdListenerотслеживает жизненный цикл рекламы и события взаимодействия с пользователем. - Слушатель
AdViewBoundingBoxListenerвызывается при изменении размера или перемещенииAdView.
AdMob OnPresentationStateChanged callback Google Mobile Ads mappings
Перечисляемый тип firebase::admob::BannerView::PresentationState и метод обработчика события OnPresentationStateChanged не включены в новый SDK Google Mobile Ads для C++.
Ниже приведены альтернативные способы обнаружения изменений состояния отображения в жизненном цикле 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 теперь является классом.
Устаревший C++ SDK Firebase AdMob обеспечивал показ рекламы с вознаграждением с помощью набора функций в пространстве имен firebase::admob::rewarded_ad . Эти функции были объединены в новый класс RewardedAd , который предоставляет рекламу с API, аналогичным InterstitialAd (см. следующий раздел).
слушатели InterstitialAd и RewardedAd
Как межстраничные объявления, так и объявления с вознаграждением считаются полноэкранными объявлениями. Для отслеживания событий жизненного цикла объявлений этих типов можно установить новый FullScreenContentListener , а для отслеживания момента, когда сервис AdMob посчитал событие платным, можно установить отдельный PaidEventListener .
RewardedAd есть дополнительный обработчик событий, отслеживающий получение пользователями вознаграждений.
Новые методы обратного вызова полноэкранной рекламы
Методы FullScreenContentListener | Методы PaidEventListener | Методы UserEarnedRewardListener |
|---|---|---|
OnAdClicked | OnPaidEvent | OnUserEarnedReward |
OnAdDismissedFullScreenContent | ||
OnAdFailedToShowFullScreenContent | ||
OnAdImpression | ||
OnAdShowedFullScreenContent |
Методы изменены/удалены/заменены
В таблице ниже перечислены конкретные методы, измененные в новом SDK Google Mobile Ads на C++. Методы с указанными параметрами остались прежними, но их сигнатуры изменились.
| Сорт | API SDK Firebase AdMob на C++ | API Google Mobile Ads C++ SDK | Примечания |
|---|---|---|---|
BannerView | MoveTo | AdView::SetPosition | |
presentation_state | Удаленный | Обработка событий осуществляется через AdViewListener , а также через AdView::Show и AdView::Hide будущих результатов. | |
SetListener | AdView::SetAdListenerAdView::SetBoundingBoxListenerAdView::SetPaidEventListener | Новая конструкция обработчика событий повышает точность обнаружения событий жизненного цикла AdView . | |
Listener::OnPresentationStateChanged | Удаленный | См. BannerView::SetListener выше. | |
Listener::OnBoundingBoxChanged | AdViewBoundingBoxListener::OnBoundingBoxChanged | ||
| Межстраничная реклама | 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 | SetFullScreenContentListenerSetPaidEventListener | ||
Destroy | Удаленный | Теперь очистка ресурсов является частью деструктора RewardedAd . | |
RewardedAd(формально RewardedVideoAd ) | Initialize | Initialize(AdParent parent) | Ранее AdParent передавался в Show , но теперь является частью инициализации. |
presentation_state | Удаленный | Перечисление presentation_state удалено. Используйте FullScreenContentListener . | |
SetListener | SetFullScreenContentListenerSetPaidEventListener Show | При показе RewardedAd также определяется обработчик событий UserEarnedReward . См. ниже. | |
Show(AdParent parent) | Show(UserEarnedRewardListener* listener) |