رویدادهای سفارشی آگهی‌های برنمایی

پلاتفرم را انتخاب کنید: Android iOS Android (قدیمی)

پیش‌نیازها

راه‌اندازی رویدادهای سفارشی را تکمیل کنید.

درخواست آگهی برنمایی

وقتی در زنجیره میانجی‌گری آبشاری به مورد خطی رویداد سفارشی می‌رسید، روش 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)
  }
}

آبجکتیو-سی

#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.

پارامتر اختیاری تعریف‌شده در AdMob UI در پیکربندی آگهی گنجانده شده است. ازطریق adConfiguration.credentials.settings[@"parameter"] می‌توانید به این پارامتر دسترسی پیدا کنید. این پارامتر معمولاً شناسه واحد آگهی است که کیت توسعه نرم‌افزار شبکه آگهی هنگام نمونه‌سازی شیء آگهی به آن نیاز دارد.

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

آبجکتیو-سی

#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 برای پارامتر خطا پیاده‌سازی می‌کند عبور دهید؛ درصورت عدم موفقیت، خطایی را که با آن مواجه شدید عبور دهید.

معمولاً این روش‌ها در داخل فراخوانی‌های برگشتی از کیت توسعه نرم‌افزار طرف سوم که آداپتور شما پیاده‌سازی می‌کند، پیاده‌سازی می‌شوند. برای این مثال، «کیت توسعه نرم‌افزار نمونه» دارای 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)
  }
}

آبجکتیو-سی

- (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()
}

آبجکتیو-سی

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

بازارسال رویدادهای میانجی‌گری به Google Mobile Ads SDK

وقتی GADMediationBannerLoadCompletionHandler را با آگهی بارشده فراخوانی کردید، آداپتور می‌تواند از شیء نماینده GADMediationBannerAdEventDelegate برگردانده‌شده برای بازارسال رویدادهای ارائه از کیت توسعه نرم‌افزار شخص ثالث به Google Mobile Ads SDK استفاده کند. کلاس SampleCustomEventBanner پروتکل SampleBannerAdDelegate را برای بازارسال کردن فراخوانی‌های برگشتی از شبکه آگهی نمونه به Google Mobile Ads SDK پیاده‌سازی می‌کند.

مهم است که رویداد سفارشی شما تا حد امکان تعداد بیشتری از این فراخوانی‌های برگشتی را بازارسال کند تا برنامه‌تان این رویدادهای معادل را از Google Mobile Ads SDK دریافت کند. در اینجا نمونه‌ای از استفاده از فراخوانی‌های برگشتی آورده شده است:

Swift

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

آبجکتیو-سی

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

با این کار، پیاده‌سازی رویدادهای سفارشی برای آگهی‌های برنمایی تکمیل می‌شود. نمونه کامل در GitHub دردسترس است. می‌توانید از آن با شبکه آگهی‌ای که ازقبل پشتیبانی می‌شود استفاده کنید یا آن را برای نمایش آگهی‌های برنمای رویداد سفارشی اصلاح کنید.