เหตุการณ์ที่กำหนดเองของโฆษณาแบนเนอร์

เลือกแพลตฟอร์ม: Android ใหม่ Android iOS

ข้อกำหนดเบื้องต้น

ตั้งค่าเหตุการณ์ที่กําหนดเองให้เสร็จสมบูรณ์

ขอโฆษณาแบนเนอร์

เมื่อรายการโฆษณาเหตุการณ์ที่กําหนดเองไปถึงในเชนสื่อกลางแบบน้ำตก ระบบจะเรียกใช้เมธอด loadBanner:adConfiguration:completionHandler: ใน ชื่อคลาสที่คุณระบุไว้เมื่อ สร้างเหตุการณ์ที่กําหนดเอง ในกรณีนี้ เมธอดดังกล่าวอยู่ใน SampleCustomEvent ซึ่งจะเรียกใช้ เมธอด loadBanner:adConfiguration:completionHandler: ใน SampleCustomEventBanner

หากต้องการขอโฆษณาแบนเนอร์ ให้สร้างหรือแก้ไขคลาสที่ใช้ GADMediationAdapter และ loadBanner:adConfiguration:completionHandler: หากมีคลาสที่ขยาย GADMediationAdapter อยู่แล้ว ให้ใช้ loadBanner:adConfiguration:completionHandler: ในคลาสดังกล่าว นอกจากนี้ ให้สร้างคลาสใหม่ เพื่อใช้ GADMediationBannerAd

ในตัวอย่างเหตุการณ์ที่กําหนดเอง SampleCustomEvent ใช้ อินเทอร์เฟซ GADMediationAdapter แล้วมอบสิทธิ์ให้ SampleCustomEventBanner

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, MediationAdapter {

  fileprivate var bannerAd: SampleCustomEventBanner?
  ...

  func loadBanner(
    for adConfiguration: MediationBannerAdConfiguration,
    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เมื่อ โหลดเสร็จสมบูรณ์

  • ใช้โปรโตคอล GADMediationBannerAd

  • รับและรายงานการเรียกกลับของเหตุการณ์โฆษณาไปยัง Google Mobile Ads SDK

พารามิเตอร์ที่ไม่บังคับซึ่งกำหนดไว้ใน UI ของ Ad Manager จะรวมอยู่ในการกำหนดค่าโฆษณา คุณเข้าถึงพารามิเตอร์ได้ผ่าน adConfiguration.credentials.settings[@"parameter"] โดยปกติแล้วพารามิเตอร์นี้จะเป็นตัวระบุหน่วยโฆษณาที่ SDK ของเครือข่ายโฆษณาต้องใช้เมื่อสร้างออบเจ็กต์โฆษณา

Swift

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

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

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

  func loadBanner(
    for adConfiguration: MediationBannerAdConfiguration,
    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 พร้อมการเรียกกลับที่เกี่ยวข้อง ดังนี้

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;
}

ส่งต่อเหตุการณ์สื่อกลางไปยัง 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 คุณสามารถใช้ตัวอย่างนี้กับเครือข่ายโฆษณาที่รองรับอยู่แล้วหรือแก้ไขเพื่อแสดงโฆษณาแบนเนอร์เหตุการณ์ที่กําหนดเองก็ได้