Migrate to the new Google Mobile Ads C++ SDK


The release of the FirebaseC++ SDK v9.1.0 introduces a new Google Mobile Ads C++ SDK.

The Google Mobile Ads C++ SDK is a new API surface that incorporates the major breaking changes made to the Firebase AdMob C++ SDKs for iOS and Android in 2021 and 2022, including the removal of deprecated APIs, and a new flow when working with full screen ad types.

The old Firebase AdMob C++ SDK (firebase::admob) has been marked deprecated and will not be receiving any updates or bug fixes moving forward.

Both the new Google Mobile Ads C++ SDK (firebase::gma) and the old Firebase AdMob C++ SDK (firebase::admob) will remain part of the build archives for the FirebaseC++ SDK during the Firebase AdMob C++ SDK deprecation window.

Legacy API removal

The following APIs have been removed from the Google Mobile Ads C++ SDK in their entirety.

RewardedVideoAd

AdMob's RewardedVideoAd namespace has been replaced with RewardedAd class. RewardedAd behaves similarly to InterstitialAd but includes an additional RewardedAdListener to receive notification of item rewards.

NativeExpressAds

AdMob's NativeExpressAd had already been marked as deprecated in each Firebase AdMob C++ SDK. Therefore NativeExpressAd is not included in the new Google Mobile Ads C++ SDK.

SDK namespace change

The SDK has relocated to a new namespace, and it has a new directory structure:

Namespace firebase::gma

The sources of the new Google Mobile Ads C++ SDK are in the firebase::gma namespace. The older firebase::admob namespace has been deprecated along with the Firebase AdMob C++ SDK.

Directory structure

Header files have moved to a new directory inside the build archive:

Deprecated Firebase AdMob C++ SDKNew Google Mobile Ads C++ SDK
include/firebase/admobinclude/firebase/gma

Library

The Firebase AdMob C++ SDK will be provided as a static library within the FirebaseC++ SDK build archive:

iOS

Deprecated Firebase AdMob C++ SDKNew Google Mobile Ads C++ SDK
firebase_admob.xcframeworkfirebase_gma.xcframework

Android

Deprecated Firebase AdMob C++ SDKNew Google Mobile Ads C++ SDK
libfirebase_admob.alibfirebase_gma.a

Class, enum, and struct migrations

The table below lists specific classes, enums, and structs that changed or have been removed. Here's a summary:

  • BannerView is renamed to AdView.
  • NativeAdExpressView is removed.
  • The RewardedVideo namespace is replaced with a RewardedAd class.
  • The PresentationState enumeration and listeners are removed and replaced with AdListener and FullScreenContent listeners.
  • The following parameters are removed as per-ad configuration parameters in AdRequests:

    • the configuration of test device IDs
    • the targeting of advertisements based on age

    Instead, these parameters can now be configured in RequestConfiguration which is a global setting that will affect all subsequent ad loads.

Deprecated firebase::admob namespaceNew firebase::gma namespace
AdSizeType (enum)AdSize::Type (enum)
BannerViewAdView
BannerView::ListenerAdListener
AdViewBoundingBoxListener
PaidEventListener
BannerView::PositionAdView::Position
BannerView::PresentationStateRemoved
ChildDirectedTreatmentStateRequestConfiguration::TagForChildDirectedTreatment
Gender (enum)Removed
InterstitialAd::ListenerFullScreenContentListener
PaidEventListener
KeyValuePairRemoved
NativeExpressAdViewRemoved
PollableRewardListenerRemoved
RewardItemAdReward
RewardedVideoAd (namespace)RewardedAd (class)
RewardedVideoAd::ListenerFullScreenContentListener
PaidEventListener
UserEarnedRewardListener
AdMobError (enum)AdErrorCode (enum)
RewardItemAdReward

SDK initialization

Each Google Mobile Ads C++ SDK initialization function immediately returns two status indicators:

  • An optional out parameter conveys whether a dependency error occurred before the initialization process started.

  • The return parameter is a reference to a firebase::Future. The Future contains the results of the asynchronous initialization of the mediation adapters on the device.

While the Google Mobile Ads C++ SDK may be invoked to load AdMob-served ads as soon as the initialization function returns, other ad networks will not serve ads until their corresponding medation adapter has been fully initialized. This process occurs asynchronously. Therefore, if you're using ad mediation in your application, we recommend that you wait for the Future to resolve before attempting to load any ads.

Before

firebase::App*app=::firebase::App::Create();firebase::InitResultresult=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;}

After

usingfirebase::App;usingfirebase::Future;usingfirebase::gma::AdapterInitializationStatus;App*app=::firebase::App::Create();firebase::InitResultresult;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 errorif(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.}

Changes to AdSize within AdView

AdSize now contains static members of common banner ad sizes, and supports AnchorAdaptive and InlineAdaptive ad sizes which have a dynamic height based on the given width and the screen's current orientation.

Static AdSize constants added to firebase::gma::AdSize

AdSize::kBanner

Mobile Marketing Association (MMA) banner ad size (320x50 density-independent pixels)

AdSize::kFullBanner

Interactive Advertising Bureau (IAB) full banner ad size (468x60 density-independent pixels)
AdSize::kLargeBannerTaller version of kBanner, typically 320x100

AdSize::kLeaderboard

Interactive Advertising Bureau (IAB) leaderboard ad size (728x90 density-independent pixels)
AdSize::kMediumRectangleInteractive Advertising Bureau (IAB) medium rectangle ad size (300x250 density-independent pixels)
Static methods in firebase::gma::AdSize to help construct instances of AdSize
GetLandscapeAnchoredAdaptiveBannerAdSizeCreates an AdSize with the given width and a Google-optimized height to create a banner ad in landscape mode
GetPortraitAnchoredAdaptiveBannerAdSizeCreates an AdSize with the given width and a Google-optimized height to create a banner ad in portrait mode
GetCurrentOrientationAnchoredAdaptiveBannerAdSizeCreates an AdSize with the given width and a Google-optimized height to create a banner ad given the current orientation
GetInlineAdaptiveBannerAdSizeCreates an AdSize most suitable for banner ads given a maximum height

This AdSize allows Google servers to choose an optimal ad size with a height less than or equal to a specified max height.

GetLandscapeInlineAdaptiveBannerAdSizeCreates an InlineAdaptiveAdSize with the given width and the device's landscape height
GetPortraitInlineAdaptiveBannerAdSizeCreates an InlineAdaptiveAdSize with the given width and the device's portrait height.
GetCurrentOrientationInlineAdaptiveBannerAdSizeA convenience method to return InlineAdaptiveAdSize given the current interface orientation given a specific width.

Before

firebase::admob::BannerView*banner_view=newfirebase::admob::BannerView();firebase::admob::AdSizead_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);

After

firebase::gma::AdView*ad_view=newfirebase::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 and global configuration

Test device IDs, TagForChildDirectedTreatment, and TagForUnderAgeOfConsent (previously handled by birthday) have been removed from AdRequest and are now part of a global RequestConfiguration. Applications may invoke firebase::gma::SetRequestConfiguration() early-on in the application's lifecycle to configure these values. All subsequent ad load operations will honor these settings once they're configured.

firebase::gma::AdRequest still exists as it provides contextual information for loading advertisements, including keywords and an optional content URL.

AdMob's AdRequest C-style struct has been replaced with a class with methods which provide a better user experience when defining and appending to the various lists of information.

Here are notable AdRequest changes:

  • Extras are now associated with a mediation adapter class name. Extras sent to the AdMob service should use the default class name as defined below.
  • When requesting an ad, apps may pass a URL of the content they are serving. This enables keyword targeting to match the ad with other content being displayed.

Before

firebase::admob::AdRequestrequest;// Keywords to be used in targeting.constchar*keywords[]={"GMA","C++","Fun"};request.keyword_count=sizeof(keywords)/sizeof(keywords[0]);request.keywords=keywords;// "Extra" key value pairs.staticconstfirebase::admob::KeyValuePairextras[]={{"extra_name","extra_value"}};request.extras_count=sizeof(extras)/sizeof(extras[0]);request.extras=kRequestExtras;// Devices that should be served test ads.constchar*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.

After

// Do once after Google Mobile Ads C++ SDK initialization.// These settings will affect all Ad Load operations.firebase::gma::RequestConfigurationconfiguration;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::AdRequestad_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)constchar*ad_network_extras_class_name="com/google/ads/mediation/admob/AdMobAdapter";#else // iOSconstchar*ad_network_extras_class_name="GADExtras";#endifad_request.add_extra(ad_network_extras_class_name,"extra_name","extra_value");// Load Ad with the AdRequest. See next section.

AdResults

LoadAd now returns a Future containing an AdResult object for all AdView, InterstitialAd, and RewardedAd ad types. The AdResult::is_successful method returns true if the ad request was successfully fulfilled, or false if not.

On failure, the AdResult contains an AdError object with service-level information about the problem, including the error code, the error message and domain strings.

Before

firebase::Future<AdResult>future;voidload_ad(){// Assume an already created AdRequest object.future=ad_view->LoadAd(ad_request);}voidyour_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.}}}

After

firebase::Future<AdResult>future;voidload_ad(){// Assumes a previously created AdRequest object.// See "AdRequest and Global Configuration" above.future=ad_view->LoadAd(ad_request);}voidyour_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.constAdResult*ad_result=future.result();if(ad_result->is_successful()!=true){// GMA failed to serve an ad. Gather information about the error.constAdError&ad_error=ad_result->ad_error();AdErrorCodeerror_code=ad_error.code();conststd::stringerror_domain=ad_error.domain();conststd::stringerror_message=ad_error.message();}else{// The ad loaded successfully.}}}}

AdListener events within AdView

AdMob's BannerView::Listener class has been replaced with two distinct listener classes in the Google Mobile Ads C++ SDK:

  • AdListener tracks ad lifecycle and user interaction events.
  • AdViewBoundingBoxListener is invoked when the AdView is resized or moved.

AdMob OnPresentationStateChanged callback Google Mobile Ads mappings

The firebase::admob::BannerView::PresentationState enumerated type and OnPresentationStateChanged listener method are not included in the new Google Mobile Ads C++ SDK.

The following are alternative ways to detect presentation state changes in the life cycle of an AdView:

firebase::admob::BannerView::Listener OnPresentationStateChanged eventfirebase::gma::AdListener counterpart
kPresentationStateHiddenWhen AdListener::OnAdClosed is invoked, or when AdView::Hide() completes its asynchronous operation successfully
kPresentationStateVisibleWithoutAdNone. Attempting to invoke AdView::Show() an unloaded AdView will result in an error.
kPresentationStateVisibleWithAdWhen AdListener::OnAdOpened is invoked, or when AdView::Show() completes its asynchronous operation successfully with an ad
kPresentationStateOpenedPartialOverlayQuery the bounding box after AdListener::OnAdOpened() has been invoked to determine the size and position of the ad being shown. Alternatively, query the AdView's position and AdSize and/or monitor the bounding box via AdViewBoundingBoxListener.
kPresentationStateCoveringUISee kPresentationStateOpenedPartialOverlay above

RewardedAd is now a class

The deprecated Firebase AdMob C++ SDK facilitated rewarded ads via a collection of functions in the firebase::admob::rewarded_ad namespace. These functions have been coalesced into a new RewardedAd class which serves ads with a similar API surface to InterstitialAd (see next section).

InterstitialAd and RewardedAd listeners

Both interstitial ads and rewarded ads are considered full screen ads. A new FullScreenContentListener can be installed to listen to advertisement life cycle events for these ad types, and a separate PaidEventListener can be installed to track when the AdMob service has deemed a paid event has occurred.

RewardedAd has an additional listener to monitor user-earned reward events.

New full screen ad callback methods

FullScreenContentListener methodsPaidEventListener methodsUserEarnedRewardListener methods
OnAdClickedOnPaidEventOnUserEarnedReward
OnAdDismissedFullScreenContent
OnAdFailedToShowFullScreenContent
OnAdImpression
OnAdShowedFullScreenContent

Methods changed/removed/replaced

The table below lists the specific methods changed in the new Google Mobile Ads C++ SDK. Methods with parameters listed remain but their signatures have changed.

ClassFirebase AdMob C++ SDK APIGoogle Mobile Ads C++ SDK APINotes
BannerViewMoveToAdView::SetPosition
presentation_stateRemovedHandled by AdViewListener events and AdView::Show and AdView::Hide future results.
SetListenerAdView::SetAdListener
AdView::SetBoundingBoxListener
AdView::SetPaidEventListener
The new listener design increases the fidelity of detecting AdView lifecycle events.
Listener::OnPresentationStateChangedRemovedSee BannerView::SetListener, above.
Listener::OnBoundingBoxChangedAdViewBoundingBoxListener::OnBoundingBoxChanged
InterstitialAd Initialize(AdParent parent, const char* ad_unit_id)Initialize(AdParent parent)The ad_unit_id parameter is now part of the LoadAd operation.
LoadAd(const AdRequest& request)LoadAd(const char* ad_unit_id, const AdRequest& request)
presentation_stateRemovedThe presentation_state enumeration has been removed. Use FullScreenContentListener.
SetListenerSetFullScreenContentListener
SetPaidEventListener
DestroyRemovedCleaning up resources is now part of the RewardedAd destructor.
RewardedAd
(formally
RewardedVideoAd)
InitializeInitialize(AdParent parent)AdParent was previously passed to Show, but is now part of initialization.
presentation_stateRemovedThe presentation_state enumeration has been removed. Use FullScreenContentListener.
SetListenerSetFullScreenContentListener
SetPaidEventListenerShow
A UserEarnedReward listener is also defined when showing a RewardedAd. See below.
Show(AdParent parent)Show(UserEarnedRewardListener* listener)