前提条件
カスタム イベントのセットアップを完了します。
リワード広告をリクエストする
ウォーターフォール メディエーション チェーンでカスタム イベント広告申込情報に到達すると、カスタム イベントの作成時に指定したクラス名で loadRewarded:adConfiguration:completionHandler: メソッドが呼び出されます。この場合、メソッドは SampleCustomEvent にあり、loadRewarded:adConfiguration:completionHandler: で SampleCustomEventRewarded を呼び出します。
リワード広告をリクエストするには、GADMediationAdapter と loadRewarded:adConfiguration:completionHandler: を実装するクラスを作成または変更します。GADMediationAdapter を拡張するクラスがすでに存在する場合は、そこに loadRewarded:adConfiguration:completionHandler: を実装します。また、GADMediationRewardedAd を実装するための新しいクラスを作成します。
この例では、SampleCustomEvent が GADMediationAdapter インターフェースを実装し、その後 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 の役割は次のとおりです。
リワード広告を読み込んでいます。
GADMediationRewardedAdプロトコルの実装。広告イベント コールバックを受信して Google Mobile Ads SDK に報告する。
AdMob の管理画面で定義された省略可能なパラメータが広告設定に含まれます。このパラメータには adConfiguration.credentials.settings[@"parameter"] を介してアクセスできます。このパラメータは通常、広告オブジェクトをインスタンス化する際に広告ネットワーク SDK が要求する広告ユニット ID です。
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]; }
広告の取得が成功した場合もエラーが発生した場合も、GADMediationRewardedLoadCompletionHandler を呼び出すことになります。成功した場合は、GADMediationRewardedAd を実装するクラスを、エラー パラメータに nil 値を指定して渡します。失敗した場合は、発生したエラーを渡します。
通常、これらのメソッドは、アダプタが実装するサードパーティ SDK のコールバック内に実装されます。この例では、関連するコールバックを含む SampleRewardedAdDelegate が「Sample SDK」に含まれています。
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 では、広告を表示する present(viewController:) メソッドを実装する必要があります。
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] } }
メディエーション イベントを Google Mobile Ads SDK に転送する
読み込まれた広告で GADMediationRewardedLoadCompletionHandler を呼び出した後、返された GADMediationRewardedAdEventDelegate デリゲート オブジェクトをアダプタが使用することにより、プレゼンテーション イベントをサードパーティ SDK から Google Mobile Ads SDK に転送できます。SampleCustomEventRewarded クラスは、SampleRewardedAdDelegate プロトコルを実装して、サンプル広告ネットワークから Google Mobile Ads SDK にコールバックを転送します。
カスタム イベントには、こうしたコールバックを可能な限り漏れなく転送させましょう。これにより、アプリは同等イベントを Google Mobile Ads SDK から受け取ることができます。コールバックの使用例を以下に示します。
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]; }
これで、リワード広告のカスタム イベントの実装が完了しました。サンプル全体は GitHub で入手できます。このサンプルは、すでにサポートされている広告ネットワークで使用することができます。また、変更を加えてカスタム イベント リワード広告を表示することもできます。