Page Summary
-
Implementing custom event rewarded ads requires completing the custom events setup.
-
To request a rewarded ad, you need to create or modify classes that implement
GADMediationAdapterandloadRewarded:adConfiguration:completionHandler:, and create a new class to implementGADMediationRewardedAd. -
The class implementing
GADMediationRewardedAdis responsible for loading the ad, implementing the protocol, and reporting ad event callbacks. -
You need to call
GADMediationRewardedLoadCompletionHandlerupon successful ad fetch or error, passing the appropriate arguments. -
It is important to forward mediation events from the third-party SDK to the Google Mobile Ads SDK using the
GADMediationRewardedAdEventDelegate.
Prerequisites
Complete the custom events setup .
Request a rewarded ad
When the custom event line item is reached in the waterfall mediation chain,
the loadRewarded:adConfiguration:completionHandler: method is called on the
class name you provided when creating a custom
event
. In this case,
that method is in SampleCustomEvent
, which then calls
the loadRewarded:adConfiguration:completionHandler:
method in SampleCustomEventRewarded
.
To request a rewarded ad, create or modify a class that implements GADMediationAdapter
and loadRewarded:adConfiguration:completionHandler:
. If
a class that extends GADMediationAdapter
already exists, implement loadRewarded:adConfiguration:completionHandler:
there. Additionally,
create a new class to implement GADMediationRewardedAd
.
In our custom event example, SampleCustomEvent
implements
the GADMediationAdapter
interface and then delegates to SampleCustomEventRewarded
.
Swift
import GoogleMobileAds class SampleCustomEvent : NSObject , MediationAdapter { fileprivate var rewardedAd : SampleCustomEventRewarded ? ... func loadRewarded ( for adConfiguration : MediationRewardedAdConfiguration , completionHandler : @ escaping GADMediationRewardedLoadCompletionHandler ) { self . rewardedAd = SampleCustomEventRewarded () self . rewardedAd ?. loadRewarded ( for : adConfiguration , completionHandler : completionHandler ) } }
Objective-C
#import "SampleCustomEvent.h" @implementation SampleCustomEvent ... SampleCustomEventRewarded * sampleRewarded ; - ( void ) loadRewardedForAdConfiguration: ( GADMediationRewardedAdConfiguration * ) adConfiguration completionHandler : ( GADMediationRewardedLoadCompletionHandler ) completionHandler { sampleRewarded = [[ SampleCustomEventRewarded alloc ] init ]; [ sampleRewarded loadRewardedForAdConfiguration : adConfiguration completionHandler : completionHandler ]; }
SampleCustomEventRewarded
is responsible for the following tasks:
-
Loading the rewarded ad.
-
Implementing the
GADMediationRewardedAdprotocol. -
Receiving and reporting ad event callbacks to Google Mobile Ads SDK .
The optional parameter defined in the AdMob UI is
included in the ad configuration.
The parameter can be accessed through adConfiguration.credentials.settings[@"parameter"]
. This parameter is
typically an ad unit identifier that an ad network SDK requires when
instantiating an ad object.
Swift
class SampleCustomEventRewarded : NSObject , MediationRewardedAd { /// The Sample Ad Network rewarded ad. var nativeAd : SampleRewarded ? /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK . var delegate : MediationRewardedAdEventDelegate ? /// Completion handler called after ad load. var completionHandler : GADMediationRewardedLoadCompletionHandler ? func loadRewarded ( for adConfiguration : MediationRewardedAdConfiguration , completionHandler : @ escaping GADMediationRewardedLoadCompletionHandler ) { rewarded = SampleRewarded . init ( adUnitID : adConfiguration . credentials . settings [ "parameter" ] as ? String ) rewarded ?. delegate = self let adRequest = SampleAdRequest () adRequest . testMode = adConfiguration . isTestRequest self . completionHandler = completionHandler rewarded ?. fetchAd ( adRequest ) } }
Objective-C
#import "SampleCustomEventRewarded.h" @interface SampleCustomEventRewarded () < SampleRewardedAdDelegate , GADMediationRewardedAd > { /// The sample rewarded ad. SampleRewarded * _rewardedAd ; /// The completion handler to call when the ad loading succeeds or fails. GADMediationRewardedLoadCompletionHandler _loadCompletionHandler ; /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK . id < GADMediationRewardedAdEventDelegate > _adEventDelegate ; } @end - ( void ) loadRewardedAdForAdConfiguration : ( GADMediationRewardedAdConfiguration * ) adConfiguration completionHandler : ( GADMediationRewardedLoadCompletionHandler ) completionHandler { __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT ; __block GADMediationRewardedLoadCompletionHandler originalCompletionHandler = [ completionHandler copy ]; _loadCompletionHandler = ^ id<GADMediationRewardedAdEventDelegate > ( _Nullable id<GADMediationRewardedAd > ad , NSError * _Nullable error ) { // Only allow completion handler to be called once. if ( atomic_flag_test_and_set ( & completionHandlerCalled )) { return nil ; } id<GADMediationRewardedAdEventDelegate > delegate = nil ; if ( originalCompletionHandler ) { // Call original handler and hold on to its return value. delegate = originalCompletionHandler ( ad , error ); } // Release reference to handler. Objects retained by the handler will also be released. originalCompletionHandler = nil ; return delegate ; }; NSString * adUnit = adConfiguration . credentials . settings [ @"parameter" ]; _rewardedAd = [[ SampleRewardedAd alloc ] initWithAdUnitID : adUnit ]; _rewardedAd . delegate = self ; SampleAdRequest * adRequest = [[ SampleAdRequest alloc ] init ]; adRequest . testMode = adConfiguration . isTestRequest ; [ _rewardedAd fetchAd : adRequest ]; }
Whether the ad is successfully fetched or encounters an error, you
would call GADMediationRewardedLoadCompletionHandler
. In the event of
success, pass through the class that implements GADMediationRewardedAd
with a nil
value for the error parameter; in the event of failure, pass
through the error you encountered.
Typically, these methods are implemented inside callbacks from the
third-party SDK your adapter implements. For this example, the Sample SDK
has a SampleRewardedAdDelegate
with relevant callbacks:
Swift
func rewardedDidLoad ( _ interstitial : SampleRewarded ) { if let handler = completionHandler { delegate = handler ( self , nil ) } } func rewarded ( rewarded : SampleRewarded , didFailToLoadAdWith errorCode : SampleErrorCode ) { let error = SampleCustomEventUtils . SampleCustomEventErrorWithCodeAndDescription ( code : SampleCustomEventErrorCode . SampleCustomEventErrorAdLoadFailureCallback , description : "Sample SDK returned an ad load failure callback with error code: \( errorCode ) " ) if let handler = completionHandler { delegate = handler ( nil , error ) } }
Objective-C
- ( void ) rewardedDidLoad: ( SampleRewarded * ) rewarded { _adEventDelegate = _loadCompletionHandler ( self , nil ); } - ( void ) rewarded: ( SampleInterstitial * ) rewarded didFailToLoadAdWithErrorCode :( SampleErrorCode ) errorCode { NSError * error = SampleCustomEventErrorWithCodeAndDescription ( SampleCustomEventErrorAdLoadFailureCallback , [ NSString stringWithFormat : @"Sample SDK returned an ad load failure " @"callback with error code: %@" , errorCode ]); _adEventDelegate = _loadCompletionHandler ( nil , error ); }
GADMediationrewardedAd
requires implementing a present(viewController:)
method to display the ad:
Swift
func present ( from viewController : UIViewController ) { if let rewarded = rewarded , rewarded . isRewardedLoaded { rewarded . show () } }
Objective-C
- ( void ) presentFromViewController: ( UIViewController * ) viewController { if ([ _rewardedAd isRewardedLoaded ]) { [ _rewardedAd show ]; } else { NSError * error = SampleCustomEventErrorWithCodeAndDescription ( SampleCustomEventErrorAdNotLoaded , [ NSString stringWithFormat : @"The rewarded ad failed to present because the ad was not loaded." ]); [ _adEventDelegate didFailToPresentWithError : error ] } }
Forward mediation events to Google Mobile Ads SDK
Once you've called GADMediationRewardedLoadCompletionHandler
with a loaded
ad, the returned GADMediationRewardedAdEventDelegate
delegate object can
then be used by the adapter to forward presentation events from the third-party
SDK to Google Mobile Ads SDK
. The SampleCustomEventRewarded
class
implements the SampleRewardedAdDelegate
protocol to forward callbacks from
the sample ad network to Google Mobile Ads SDK
.
It's important that your custom event forwards as many of these callbacks as possible, so that your app receives these equivalent events from Google Mobile Ads SDK . Here's an example of using callbacks:
Swift
func rewardedAdDidPresent ( _ rewarded : SampleRewardedAd ) { delegate ?. willPresentFullScreenVideo () delegate ?. didStartVideo () } func rewardedAdUserDidEarnReward ( _ rewarded : SampleRewardedAd ) { AdReward aReward = AdReward ( "" , rewarded ) delegate . didRewardUser () }
Objective-C
- ( void ) rewardedAdDidPresent: ( SampleRewardedAd * ) rewardedAd { [ _adEventDelegate willPresentFullScreenView ]; [ _adEventDelegate didStartVideo ]; } - ( void ) rewardedAd: ( nonnull SampleRewardedAd * ) rewardedAd userDidEarnReward :( NSUInteger ) reward { GADAdReward * aReward = [[ GADAdReward alloc ] initWithRewardType : @"" rewardAmount :[ NSDecimalNumber numberWithUnsignedInt : reward ]]; [ _adEventDelegate didRewardUserWithReward ]; }
This completes the custom events implementation for rewarded ads. The full example is available on GitHub . You can use it with an ad network that is already supported or modify it to display custom event rewarded ads.

