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++ SDK | New Google Mobile Ads C++ SDK |
---|---|
include/firebase/admob | include/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++ SDK | New Google Mobile Ads C++ SDK |
---|---|
firebase_admob.xcframework | firebase_gma.xcframework |
Android
Deprecated Firebase AdMob C++ SDK | New Google Mobile Ads C++ SDK |
---|---|
libfirebase_admob.a | libfirebase_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 toAdView
.NativeAdExpressView
is removed.- The
RewardedVideo
namespace is replaced with aRewardedAd
class. - The
PresentationState
enumeration and listeners are removed and replaced withAdListener
andFullScreenContent
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 namespace | New firebase::gma namespace |
---|---|
AdSizeType (enum) | AdSize::Type (enum) |
BannerView | AdView |
BannerView::Listener | AdListener AdViewBoundingBoxListener PaidEventListener |
BannerView::Position | AdView::Position |
BannerView::PresentationState | Removed |
ChildDirectedTreatmentState | RequestConfiguration::TagForChildDirectedTreatment |
Gender (enum) | Removed |
InterstitialAd::Listener | FullScreenContentListener PaidEventListener |
KeyValuePair | Removed |
NativeExpressAdView | Removed |
PollableRewardListener | Removed |
RewardItem | AdReward |
RewardedVideoAd (namespace) | RewardedAd (class) |
RewardedVideoAd::Listener | FullScreenContentListener PaidEventListener UserEarnedRewardListener |
AdMobError (enum) | AdErrorCode (enum) |
RewardItem | AdReward |
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
. TheFuture
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::kLargeBanner | Taller version of kBanner , typically 320x100 |
AdSize::kLeaderboard | Interactive Advertising Bureau (IAB) leaderboard ad size (728x90 density-independent pixels) |
AdSize::kMediumRectangle | Interactive Advertising Bureau (IAB) medium rectangle ad size (300x250 density-independent pixels) |
Static methods in firebase::gma::AdSize to help construct instances of AdSize | |
---|---|
GetLandscapeAnchoredAdaptiveBannerAdSize | Creates an AdSize with the given width and a Google-optimized height to create a banner ad in landscape mode |
GetPortraitAnchoredAdaptiveBannerAdSize | Creates an AdSize with the given width and a Google-optimized height to create a banner ad in portrait mode |
GetCurrentOrientationAnchoredAdaptiveBannerAdSize | Creates an AdSize with the given width and a Google-optimized height to create a banner ad given the current orientation |
GetInlineAdaptiveBannerAdSize | Creates an AdSize most suitable for banner ads given a maximum height This |
GetLandscapeInlineAdaptiveBannerAdSize | Creates an InlineAdaptive AdSize with the given width and the device's landscape height |
GetPortraitInlineAdaptiveBannerAdSize | Creates an InlineAdaptive AdSize with the given width and the device's portrait height. |
GetCurrentOrientationInlineAdaptiveBannerAdSize | A convenience method to return InlineAdaptive AdSize 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 theAdView
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 event | firebase::gma::AdListener counterpart |
---|---|
kPresentationStateHidden | When AdListener::OnAdClosed is invoked, or when AdView::Hide() completes its asynchronous operation successfully |
kPresentationStateVisibleWithoutAd | None. Attempting to invoke AdView::Show() an unloaded AdView will result in an error. |
kPresentationStateVisibleWithAd | When AdListener::OnAdOpened is invoked, or when AdView::Show() completes its asynchronous operation successfully with an ad |
kPresentationStateOpenedPartialOverlay | Query 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 . |
kPresentationStateCoveringUI | See 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 methods | PaidEventListener methods | UserEarnedRewardListener methods |
---|---|---|
OnAdClicked | OnPaidEvent | OnUserEarnedReward |
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.
Class | Firebase AdMob C++ SDK API | Google Mobile Ads C++ SDK API | Notes |
---|---|---|---|
BannerView | MoveTo | AdView::SetPosition | |
presentation_state | Removed | Handled by AdViewListener events and AdView::Show and AdView::Hide future results. | |
SetListener | AdView::SetAdListener AdView::SetBoundingBoxListener AdView::SetPaidEventListener | The new listener design increases the fidelity of detecting AdView lifecycle events. | |
Listener::OnPresentationStateChanged | Removed | See BannerView::SetListener , above. | |
Listener::OnBoundingBoxChanged | AdViewBoundingBoxListener::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_state | Removed | The presentation_state enumeration has been removed. Use FullScreenContentListener . | |
SetListener | SetFullScreenContentListener SetPaidEventListener | ||
Destroy | Removed | Cleaning up resources is now part of the RewardedAd destructor. | |
RewardedAd (formally RewardedVideoAd ) | Initialize | Initialize(AdParent parent) | AdParent was previously passed to Show , but is now part of initialization. |
presentation_state | Removed | The presentation_state enumeration has been removed. Use FullScreenContentListener . | |
SetListener | SetFullScreenContentListener SetPaidEventListener Show | A UserEarnedReward listener is also defined when showing a RewardedAd . See below. | |
Show(AdParent parent) | Show(UserEarnedRewardListener* listener) |