אירועים מותאמים אישית של מודעות באנר

דרישות מוקדמות

השלם את ההגדרה של אירועים מותאמים אישית.

בקשה למודעת באנר

כשמגיעים לפריט של האירוע המותאם אישית בשרשרת לבחירת הרשת ב-Waterfall, המערכת מפעילה אתthe loadBanner:adConfiguration:completionHandler: method לפי שם המחלקה שסיפקתם כשיוצרים אירוע בהתאמה אישית. במקרה הזה, השיטה הזו היא ב-SampleCustomEvent, ואז קוראת ל-the loadBanner:adConfiguration:completionHandler: method ב- SampleCustomEventBanner.

כדי לבקש מודעת באנר, צריך ליצור או לשנות מחלקה שמוטמעת בה GADMediationAdapter ו-loadBanner:adConfiguration:completionHandler:. אם כבר קיימת מחלקה שמרחיבה את GADMediationAdapter, מטמיעים בה את loadBanner:adConfiguration:completionHandler:. בנוסף, צריך ליצור מחלקה חדשה כדי להטמיע את GADMediationBannerAd.

בדוגמה של האירוע בהתאמה אישית, SampleCustomEvent מטמיעthe GADMediationAdapter interface ואז מעניק גישה ל-SampleCustomEventBanner.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, GADMediationAdapter {

  fileprivate var bannerAd: SampleCustomEventBanner?
  ...

  func loadBanner(
    for adConfiguration: GADMediationBannerAdConfiguration,
    completionHandler: @escaping GADMediationBannerLoadCompletionHandler
  ) {
    self.bannerAd = SampleCustomEventBanner()
    self.bannerAd?.loadBanner(
      for: adConfiguration, completionHandler: completionHandler)
  }
}

Objective-C

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent
...

SampleCustomEventBanner *sampleBanner;

- (void)loadBannerForAdConfiguration:
            (GADMediationBannerAdConfiguration *)adConfiguration
                   completionHandler:(GADMediationBannerLoadCompletionHandler)
                                         completionHandler {
  sampleBanner = [[SampleCustomEventBanner alloc] init];
  [sampleBanner loadBannerForAdConfiguration:adConfiguration
                           completionHandler:completionHandler];
}

SampleCustomEventBanner אחראי על המשימות הבאות:

  • טעינה של מודעת הבאנר והפעלה GADMediationBannerLoadCompletionHandler method לאחר סיום הטעינה

  • הטמעה של GADMediationBannerAd protocol

  • קבלת קריאות חוזרות של אירועי מודעות ודיווח עליהן ל-Google Mobile Ads SDK

הפרמטר האופציונלי שמוגדר Ad Manager בממשק המשתמש כלול בהגדרות האישיות של המודעות. אפשר לגשת לפרמטר דרך adConfiguration.credentials.settings[@"parameter"]. הפרמטר הזה הוא בדרך כלל מזהה של יחידת מודעות שנדרש ל-SDK של רשת מודעות כשיוצרים אובייקט של מודעה.

Swift

class SampleCustomEventBanner: NSObject, GADMediationBannerAd {
  /// The Sample Ad Network banner ad.
  var bannerAd: SampleBanner?

  /// The ad event delegate to forward ad rendering events to the Google Mobile Ads SDK.
  var delegate: GADMediationBannerAdEventDelegate?

  /// Completion handler called after ad load
  var completionHandler: GADMediationBannerLoadCompletionHandler?

  func loadBanner(
    for adConfiguration: GADMediationBannerAdConfiguration,
    completionHandler: @escaping GADMediationBannerLoadCompletionHandler
  ) {
    // Create the bannerView with the appropriate size.
    let adSize = adConfiguration.adSize
    bannerAd = SampleBanner(
      frame: CGRect(x: 0, y: 0, width: adSize.size.width, height: adSize.size.height))
    bannerAd?.delegate = self
    bannerAd?.adUnit = adConfiguration.credentials.settings["parameter"] as? String
    let adRequest = SampleAdRequest()
    adRequest.testMode = adConfiguration.isTestRequest
    self.completionHandler = completionHandler
    bannerAd?.fetchAd(adRequest)
  }
}

Objective-C

#import "SampleCustomEventBanner.h"

@interface SampleCustomEventBanner () <SampleBannerAdDelegate,
                                       GADMediationBannerAd> {
  /// The sample banner ad.
  SampleBanner *_bannerAd;

  /// The completion handler to call when the ad loading succeeds or fails.
  GADMediationBannerLoadCompletionHandler _loadCompletionHandler;

  /// The ad event delegate to forward ad rendering events to the Google Mobile
  /// Ads SDK.
  id <GADMediationBannerAdEventDelegate> _adEventDelegate;
}
@end

@implementation SampleCustomEventBanner

- (void)loadBannerForAdConfiguration:
            (GADMediationBannerAdConfiguration *)adConfiguration
                   completionHandler:(GADMediationBannerLoadCompletionHandler)
                                         completionHandler {
  __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
  __block GADMediationBannerLoadCompletionHandler originalCompletionHandler =
      [completionHandler copy];

  _loadCompletionHandler = ^id<GADMediationBannerAdEventDelegate>(
      _Nullable id<GADMediationBannerAd> ad, NSError *_Nullable error) {
    // Only allow completion handler to be called once.
    if (atomic_flag_test_and_set(&completionHandlerCalled)) {
      return nil;
    }

    id<GADMediationBannerAdEventDelegate> 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"];
  _bannerAd = [[SampleBanner alloc]
      initWithFrame:CGRectMake(0, 0, adConfiguration.adSize.size.width,
                               adConfiguration.adSize.size.height)];
  _bannerAd.adUnit = adUnit;
  _bannerAd.delegate = self;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = adConfiguration.isTestRequest;
  [_bannerAd fetchAd:adRequest];
}

גם אם המודעה אוחזרה בהצלחה וגם אם מופיעה שגיאה, צריך לבצע קריאה ל-GADMediationBannerLoadCompletionHandler. במקרה של הצלחה, מעבירים את המחלקה שמטמיעה את GADMediationBannerAd עם הערך nil לפרמטר השגיאה. במקרה של כישלון, מעבירים את השגיאה שבה נתקלתם.

בדרך כלל, השיטות האלה מוטמעות בקריאות חוזרות מ-SDK של הצד השלישי שהמתאם מטמיע. בדוגמה הזו, ה-SDK לדוגמה כולל SampleBannerAdDelegate עם קריאה חוזרת (callback) רלוונטית:

Swift

func bannerDidLoad(_ banner: SampleBanner) {
  if let handler = completionHandler {
    delegate = handler(self, nil)
  }
}

func banner(
  _ banner: SampleBanner, didFailToLoadAdWith errorCode: SampleErrorCode
) {
  let error =
    SampleCustomEventUtilsSwift.SampleCustomEventErrorWithCodeAndDescription(
      code: SampleCustomEventErrorCodeSwift
        .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)bannerDidLoad:(SampleBanner *)banner {
  _adEventDelegate = _loadCompletionHandler(self, nil);
}

- (void)banner:(SampleBanner *)banner
    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);
}

ב-GADMediationBannerAd צריך להטמיע נכס UIView:

Swift

var view: UIView {
  return bannerAd ?? UIView()
}

Objective-C

- (nonnull UIView *)view {
  return _bannerAd;
}

העברת אירועים של תהליך בחירת הרשת (Mediation) אל Google Mobile Ads SDK

אחרי שקוראים ל-GADMediationBannerLoadCompletionHandler עם מודעה שנטענה, המתאם יכול להשתמש באובייקט ההאצלה GADMediationBannerAdEventDelegate שהוחזר כדי להעביר אירועי הצגה מה-SDK של הצד השלישי ל-Google Mobile Ads SDK. המחלקה SampleCustomEventBanner מטמיעה את הפרוטוקול SampleBannerAdDelegate כדי להעביר קריאות חוזרות מרשת המודעות לדוגמה אל Google Mobile Ads SDK.

חשוב שהאירוע המותאם אישית יעביר כמה שיותר קריאות חוזרות כאלה, כדי שהאפליקציה תקבל את האירועים המקבילים האלה מ-Google Mobile Ads SDK. דוגמה לשימוש בהתקשרות חזרה:

Swift

func bannerWillLeaveApplication(_ banner: SampleBanner) {
  delegate?.reportClick()
}

Objective-C

- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [_adEventDelegate reportClick];
}

הפעולה הזו הושלמה בהטמעה של האירועים המותאמים אישית במודעות הבאנר. הדוגמה המלאה מופיעה ב-GitHub. ניתן להשתמש בה ברשת מודעות שכבר נתמכת, או לשנות אותה כדי להציג מודעות באנר מותאמות אישית לאירועים.