الأحداث المخصّصة للإعلانات المدمجة مع المحتوى

المتطلبات الأساسية

أكمِل إعداد الأحداث المخصّصة.

طلب إعلان مدمج مع المحتوى

عند الوصول إلى عنصر الحدث المخصّص في سلسلة توسّط العرض الإعلاني بدون انقطاع، يتم استدعاءthe loadNativeAd:adConfiguration:completionHandler: method إلى اسم الفئة الذي قدّمته عند إنشاء حدث مخصّص. في هذه الحالة، تكون هذه الطريقة في SampleCustomEvent، والتي تستدعي the loadNativeAd:adConfiguration:completionHandler: method في SampleCustomEventNative.

لطلب إعلان مدمج مع المحتوى، يُرجى إنشاء أو تعديل فئة تنفِّذ GADMediationAdapter وloadNativeAd:adConfiguration:completionHandler:. في حال توفّر فئة تضيف GADMediationAdapter، يمكنك تنفيذ loadNativeAd:adConfiguration:completionHandler: في تلك الفئة. بالإضافة إلى ذلك، يمكنك إنشاء فئة جديدة لتنفيذ علامة GADMediationNativeAd.

في مثال الحدث المخصّص، SampleCustomEvent تنفّذ the GADMediationAdapter interface ثم تفوض إلى SampleCustomEventNative.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, GADMediationAdapter {

  fileprivate var nativeAd: SampleCustomEventNativeAd?

  func loadNativeAd(
    for adConfiguration: GADMediationNativeAdConfiguration,
    completionHandler: @escaping GADMediationNativeAdLoadCompletionHandler
  ) {
    self.nativeAd = SampleCustomEventNativeAd()
    self.nativeAd?.loadNativeAd(
      for: adConfiguration, completionHandler: completionHandler)
  }
}

Objective-C

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent

SampleCustomEventNativeAd *sampleNativeAd;

- (void)loadNativeAdForAdConfiguration:
            (GADMediationNativeAdConfiguration *)adConfiguration
                     completionHandler:
                         (GADMediationNativeAdLoadCompletionHandler)
                             completionHandler {
  sampleNative = [[SampleCustomEventNativeAd alloc] init];
  [sampleNative loadNativeAdForAdConfiguration:adConfiguration
                             completionHandler:completionHandler];
}

"SampleCustomEventNative " مسؤول عن المهام التالية:

  • جارٍ تحميل الإعلان المدمج مع المحتوى

  • تنفيذ GADMediationNativeAd protocol

  • تلقّي طلبات معاودة الاتصال بأحداث الإعلانات وإعداد تقارير عنها في "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة"

يتم تضمين المعلمة الاختيارية المحددة في AdMob واجهة المستخدم في إعداد الإعلان. يمكن الوصول إلى المَعلمة من خلال adConfiguration.credentials.settings[@"parameter"]. عادةً ما تكون هذه المَعلمة معرّف وحدة إعلانية تطلبه حزمة تطوير البرامج (SDK) لشبكة الإعلانات عند تحديد كائن إعلان.

Swift

class SampleCustomEventNativeAd: NSObject, GADMediationNativeAd {
  /// The Sample Ad Network native ad.
  var nativeAd: SampleNativeAd?

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

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

  func loadNativeAd(
    for adConfiguration: GADMediationNativeAdConfiguration,
    completionHandler: @escaping GADMediationNativeLoadCompletionHandler
  ) {
    let adLoader = SampleNativeAdLoader()
    let sampleRequest = SampleNativeAdRequest()

    // The Google Mobile Ads SDK requires the image assets to be downloaded
    // automatically unless the publisher specifies otherwise by using the
    // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If
    // your network doesn't have an option like this and instead only ever
    // returns URLs for images (rather than the images themselves), your adapter
    // should download image assets on behalf of the publisher. This should be
    // done after receiving the native ad object from your network's SDK, and
    // before calling the connector's adapter:didReceiveMediatedNativeAd: method.
    sampleRequest.shouldDownloadImages = true
    sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any
    sampleRequest.shouldRequestMultipleImages = false
    let options = adConfiguration.options
    for loaderOptions: GADAdLoaderOptions in options {
      if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions {
        sampleRequest.shouldRequestMultipleImages =
          imageOptions.shouldRequestMultipleImages
        // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is
        // YES, the adapter should send just the URLs for the images.
        sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading
      } else if let mediaOptions = loaderOptions
        as? GADNativeAdMediaAdLoaderOptions
      {
        switch mediaOptions.mediaAspectRatio {
        case GADMediaAspectRatio.landscape:
          sampleRequest.preferredImageOrientation =
            NativeAdImageOrientation.landscape
        case GADMediaAspectRatio.portrait:
          sampleRequest.preferredImageOrientation =
            NativeAdImageOrientation.portrait
        default:
          sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any
        }
      }
    }
    // This custom event uses the server parameter to carry an ad unit ID, which
    // is the most common use case.
    adLoader.delegate = self
    adLoader.adUnitID =
      adConfiguration.credentials.settings["parameter"] as? String
    self.completionHandler = completionHandler
    adLoader.fetchAd(sampleRequest)
  }
}

Objective-C

#import "SampleCustomEventNativeAd.h"

@interface SampleCustomEventNativeAd () <SampleNativeAdDelegate,
                                         GADMediationNativeAd> {
  /// The sample native ad.
  SampleNativeAd *_nativeAd;

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

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

- (void)loadNativeAdForAdConfiguration:
            (GADMediationNativeAdConfiguration *)adConfiguration
                     completionHandler:(GADMediationNativeLoadCompletionHandler)
                                           completionHandler {
  __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
  __block GADMediationNativeLoadCompletionHandler originalCompletionHandler =
      [completionHandler copy];

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

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

  SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init];
  SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init];

  // The Google Mobile Ads SDK requires the image assets to be downloaded
  // automatically unless the publisher specifies otherwise by using the
  // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If
  // your network doesn't have an option like this and instead only ever returns
  // URLs for images (rather than the images themselves), your adapter should
  // download image assets on behalf of the publisher. This should be done after
  // receiving the native ad object from your network's SDK, and before calling
  // the connector's adapter:didReceiveMediatedNativeAd: method.
  sampleRequest.shouldDownloadImages = YES;

  sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny;
  sampleRequest.shouldRequestMultipleImages = NO;
  sampleRequest.testMode = adConfiguration.isTestRequest;

  for (GADAdLoaderOptions *loaderOptions in adConfiguration.options) {
    if ([loaderOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) {
      GADNativeAdImageAdLoaderOptions *imageOptions =
          (GADNativeAdImageAdLoaderOptions *)loaderOptions;
      sampleRequest.shouldRequestMultipleImages =
          imageOptions.shouldRequestMultipleImages;

      // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is
      // YES, the adapter should send just the URLs for the images.
      sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading;
    } else if ([loaderOptions
                   isKindOfClass:[GADNativeAdMediaAdLoaderOptions class]]) {
      GADNativeAdMediaAdLoaderOptions *mediaOptions =
          (GADNativeAdMediaAdLoaderOptions *)loaderOptions;
      switch (mediaOptions.mediaAspectRatio) {
        case GADMediaAspectRatioLandscape:
          sampleRequest.preferredImageOrientation =
              NativeAdImageOrientationLandscape;
          break;
        case GADMediaAspectRatioPortrait:
          sampleRequest.preferredImageOrientation =
              NativeAdImageOrientationPortrait;
          break;
        default:
          sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny;
          break;
      }
    } else if ([loaderOptions isKindOfClass:[GADNativeAdViewAdOptions class]]) {
      _nativeAdViewAdOptions = (GADNativeAdViewAdOptions *)loaderOptions;
    }
  }

  // This custom event uses the server parameter to carry an ad unit ID, which
  // is the most common use case.
  NSString *adUnit = adConfiguration.credentials.settings[@"parameter"];
  adLoader.adUnitID = adUnit;
  adLoader.delegate = self;

  [adLoader fetchAd:sampleRequest];
}

سواء تم استرجاع الإعلان بنجاح أو واجه خطأً، يمكنك طلب GADMediationNativeAdLoadCompletionHandler. في حال النجاح، استخدِم الفئة التي تنفِّذ GADMediationNativeAd مع استخدام القيمة nil لمَعلمة الخطأ. وفي حال تعذُّر إتمام العملية، يمكنك عرض الخطأ الذي واجهته.

عادةً ما يتم تنفيذ هذه الطرق داخل عمليات معاودة الاتصال من حزمة تطوير البرامج (SDK) التابعة لجهة خارجية التي ينفِّذها المحوِّل. في هذا المثال، تحتوي عيّنة SDK على SampleNativeAdDelegate مع استدعاءات ذات صلة:

Swift

func adLoader(
  _ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd
) {
  extraAssets = [
    SampleCustomEventConstantsSwift.awesomenessKey: nativeAd.degreeOfAwesomeness
      ?? ""
  ]

  if let image = nativeAd.image {
    images = [GADNativeAdImage(image: image)]
  } else {
    let imageUrl = URL(fileURLWithPath: nativeAd.imageURL)
    images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)]
  }
  if let mappedIcon = nativeAd.icon {
    icon = GADNativeAdImage(image: mappedIcon)
  } else {
    let iconURL = URL(fileURLWithPath: nativeAd.iconURL)
    icon = GADNativeAdImage(url: iconURL, scale: nativeAd.iconScale)
  }

  adChoicesView = SampleAdInfoView()
  self.nativeAd = nativeAd
  if let handler = completionHandler {
    delegate = handler(self, nil)
  }
}

func adLoader(
  _ adLoader: SampleNativeAdLoader,
  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)adLoader:(SampleNativeAdLoader *)adLoader
    didReceiveNativeAd:(SampleNativeAd *)nativeAd {
  if (nativeAd.image) {
    _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ];
  } else {
    NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL];
    _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL
                                                 scale:nativeAd.imageScale] ];
  }

  if (nativeAd.icon) {
    _icon = [[GADNativeAdImage alloc] initWithImage:nativeAd.icon];
  } else {
    NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:nativeAd.iconURL];
    _icon = [[GADNativeAdImage alloc] initWithURL:iconURL
                                            scale:nativeAd.iconScale];
  }

  // The sample SDK provides an AdChoices view (SampleAdInfoView). If your SDK
  // provides image and click through URLs for its AdChoices icon instead of an
  // actual UIView, the adapter is responsible for downloading the icon image
  // and creating the AdChoices icon view.
  _adChoicesView = [[SampleAdInfoView alloc] init];
  _nativeAd = nativeAd;

  _adEventDelegate = _loadCompletionHandler(self, nil);
}

- (void)adLoader:(SampleNativeAdLoader *)adLoader
    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);
}

تعيين الإعلانات المدمجة مع المحتوى

تحتوي حِزم SDK المختلفة على أشكال فريدة خاصة بها للإعلانات المدمجة مع المحتوى. على سبيل المثال، قد يعرض أحدهما كائنات تحتوي على حقل "title"، بينما قد يحتوي عنصر آخر على "headline". بالإضافة إلى ذلك، يمكن أن تختلف الطرق المستخدمة لتتبع مرات الظهور ومعالجة النقرات من حزمة SDK إلى أخرى.

لحل هذه المشاكل، عندما يتلقّى حدث مخصّص عنصر إعلان مدمج مع المحتوى من حزمة تطوير البرامج (SDK) المستندة إلى التوسّط، يجب أن يستخدم فئة تنفِّذ GADMediationNativeAd، مثل SampleCustomEventNativeAd، من أجل "ربط" كائن الإعلان المدمج مع المحتوى في حزمة تطوير البرامج (SDK) المعتمَدة على التوسّط بحيث يتطابق مع الواجهة المتوقعة من حزمة "SDK لإعلانات Google على الأجهزة الجوّالة".

نلقي الآن نظرة فاحصة على تفاصيل تنفيذ SampleCustomEventNativeAd.

تخزين تعييناتك

من المتوقّع أن ينفِّذ GADMediationNativeAd بعض الخصائص التي يتم ربطها من خصائص حزمة تطوير البرامج (SDK) الأخرى:

Swift

var nativeAd: SampleNativeAd?

var headline: String? {
  return nativeAd?.headline
}

var images: [GADNativeAdImage]?

var body: String? {
  return nativeAd?.body
}

var icon: GADNativeAdImage?

var callToAction: String? {
  return nativeAd?.callToAction
}

var starRating: NSDecimalNumber? {
  return nativeAd?.starRating
}

var store: String? {
  return nativeAd?.store
}

var price: String? {
  return nativeAd?.price
}

var advertiser: String? {
  return nativeAd?.advertiser
}

var extraAssets: [String: Any]? {
  return [
    SampleCustomEventConstantsSwift.awesomenessKey:
      nativeAd?.degreeOfAwesomeness
      ?? ""
  ]
}

var adChoicesView: UIView?

var mediaView: UIView? {
  return nativeAd?.mediaView
}

Objective-C

/// Used to store the ad's images. In order to implement the
/// GADMediationNativeAd protocol, we use this class to return the images
/// property.
NSArray<GADNativeAdImage *> *_images;

/// Used to store the ad's icon. In order to implement the GADMediationNativeAd
/// protocol, we use this class to return the icon property.
GADNativeAdImage *_icon;

/// Used to store the ad's ad choices view. In order to implement the
/// GADMediationNativeAd protocol, we use this class to return the adChoicesView
/// property.
UIView *_adChoicesView;

- (nullable NSString *)headline {
  return _nativeAd.headline;
}

- (nullable NSArray<GADNativeAdImage *> *)images {
  return _images;
}

- (nullable NSString *)body {
  return _nativeAd.body;
}

- (nullable GADNativeAdImage *)icon {
  return _icon;
}

- (nullable NSString *)callToAction {
  return _nativeAd.callToAction;
}

- (nullable NSDecimalNumber *)starRating {
  return _nativeAd.starRating;
}

- (nullable NSString *)store {
  return _nativeAd.store;
}

- (nullable NSString *)price {
  return _nativeAd.price;
}

- (nullable NSString *)advertiser {
  return _nativeAd.advertiser;
}

- (nullable NSDictionary<NSString *, id> *)extraAssets {
  return
      @{SampleCustomEventExtraKeyAwesomeness : _nativeAd.degreeOfAwesomeness};
}

- (nullable UIView *)adChoicesView {
  return _adChoicesView;
}

- (nullable UIView *)mediaView {
  return _nativeAd.mediaView;
}

- (BOOL)hasVideoContent {
  return self.mediaView != nil;
}

يمكن أن توفر بعض الشبكات التي تعتمد على التوسّط مواد عرض إضافية غير تلك المحدّدة في "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة". يتضمّن بروتوكول GADMediationNativeAd طريقة تُسمى extraAssets تستخدمها حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" لاسترداد أي من مواد العرض "الإضافية" هذه من مصمم الخرائط.

ربط مواد عرض الصور

إنّ ربط مواد عرض الصور أكثر تعقيدًا من ربط أنواع بيانات أبسط مثل NSString أو double. قد يتم تنزيل الصور تلقائيًا أو إرجاعها كقيم عنوان URL. وقد تتفاوت كثافة وحدات البكسل أيضًا.

لمساعدتك في إدارة هذه التفاصيل، توفّر حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" الفئة GADNativeAdImage. يجب عرض معلومات مواد عرض الصور (سواء كانت كائنات UIImage فعلية أو قيم NSURL فقط) إلى حزمة SDK لإعلانات Google على الأجهزة الجوّالة باستخدام هذه الفئة.

في ما يلي كيفية معالجة فئة مصمم الخرائط لإنشاء GADNativeAdImage لعرض صورة الرمز:

Swift

if let image = nativeAd.image {
  images = [GADNativeAdImage(image: image)]
} else {
  let imageUrl = URL(fileURLWithPath: nativeAd.imageURL)
  images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)]
}

Objective-C

if (nativeAd.image) {
  _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ];
} else {
  NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL];
  _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL
                                               scale:nativeAd.imageScale] ];
}

الأحداث الناتجة عن مرات الظهور والنقرات

تحتاج كل من حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" وحزمة تطوير البرامج (SDK) المستندة إلى التوسّط إلى معرفة وقت حدوث مرة ظهور أو نقرة، ولكن تحتاج حزمة SDK واحدة فقط إلى تتبُّع هذه الأحداث. هناك أسلوبان مختلفان يمكن أن تستخدِمهما الأحداث المخصّصة، اعتمادًا على ما إذا كانت حزمة تطوير البرامج (SDK) المستندة إلى التوسّط تتيح تتبُّع مرات الظهور والنقرات بمفردها.

تتبُّع النقرات ومرّات الظهور باستخدام "SDK لإعلانات Google على الأجهزة الجوّالة"

إذا لم تنفِّذ حزمة SDK المعتمَدة على التوسّط تتبُّع مرات الظهور والنقرات الخاصة بها، ولكنها توفّر طرقًا لتسجيل النقرات ومرات الظهور، يمكن لحزمة SDK لإعلانات Google على الأجهزة الجوّالة تتبُّع هذه الأحداث وإرسال إشعار إلى المحوّل. GADMediationNativeAd protocol تتضمن طريقتين: didRecordImpression: و didRecordClickOnAssetWithName:view:viewController: يمكن للأحداث المخصّصة تنفيذهما لاستدعاء الطريقة المقابلة في عنصر الإعلان المدمج مع التوسط:

Swift

func didRecordImpression() {
  nativeAd?.recordImpression()
}

func didRecordClickOnAsset(
  withName assetName: GADUnifiedNativeAssetIdentifier,
  view: UIView,
  wController: UIViewController
) {
  nativeAd?.handleClick(on: view)
}

Objective-C

- (void)didRecordImpression {
  if (self.nativeAd) {
    [self.nativeAd recordImpression];
  }
}

- (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName
                                 view:(UIView *)view
                       viewController:(UIViewController *)viewController {
  if (self.nativeAd) {
    [self.nativeAd handleClickOnView:view];
  }
}

وبما أنّ الفئة التي تنفّذ GADMediationNativeAd protocolالبروتوكول تشير إلى كائن الإعلان المدمج مع المحتوى في "نموذج حزمة تطوير البرامج (SDK)"، يمكنها استدعاء الطريقة المناسبة في ذلك العنصر للإبلاغ عن نقرة أو مرة ظهور. تجدر الإشارة إلى أنّ الطريقة didRecordClickOnAssetWithName:view:viewController: تأخذ معلَمة واحدة، وهي الكائن View المطابق لمادة عرض الإعلان المدمج مع المحتوى التي تلقت النقرة.

تتبُّع النقرات ومرات الظهور باستخدام حزمة تطوير البرامج (SDK) المستندة إلى التوسّط

قد تُفضِّل بعض حِزم SDK المستندة إلى التوسّط تتبُّع النقرات ومرات الظهور من تلقاء نفسها. في هذه الحالة، عليك تنفيذ الطريقتَين handlesUserClicks وhandlesUserImpressions كما هو موضّح في المقتطف أدناه. يعني عرض YES أنّك تشير إلى أنّ الحدث المخصّص يتحمل مسؤولية تتبُّع هذه الأحداث، وسيتم إرسال إشعار إلى حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" عند وقوع هذه الأحداث.

يمكن للأحداث المخصّصة التي تلغي تتبُّع النقرات ومرات الظهور استخدام الرسالة didRenderInView: لتمرير عرض الإعلان المدمج مع المحتوى إلى كائن الإعلانات المدمجة مع المحتوى في حزمة تطوير البرامج (SDK) المستندة إلى التوسّط للسماح لحزمة تطوير البرامج (SDK) المستندة إلى التوسّط بتنفيذ التتبّع الفعلي. إنّ نموذج حزمة تطوير البرامج (SDK) من مشروعنا كمثال على الأحداث المخصّصة (الذي تم أخذ مقتطفات الرمز منه في هذا الدليل) لا يستخدم هذه الطريقة، ولكن إذا استخدمه رمز الحدث المخصّص، سيستدعي طريقة setNativeAdView:view: كما هو موضّح في المقتطف أدناه:

Swift

func handlesUserClicks() -> Bool {
  return true
}
func handlesUserImpressions() -> Bool {
  return true
}

func didRender(
  in view: UIView, clickableAssetViews: [GADNativeAssetIdentifier: UIView],
  nonclickableAssetViews: [GADNativeAssetIdentifier: UIView],
  viewController: UIViewController
) {
  // This method is called when the native ad view is rendered. Here you would pass the UIView
  // back to the mediated network's SDK.
  self.nativeAd?.setNativeAdView(view)
}

Objective-C

- (BOOL)handlesUserClicks {
  return YES;
}

- (BOOL)handlesUserImpressions {
  return YES;
}

- (void)didRenderInView:(UIView *)view
       clickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *)
                               clickableAssetViews
    nonclickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *)
                               nonclickableAssetViews
            viewController:(UIViewController *)viewController {
  // This method is called when the native ad view is rendered. Here you would
  // pass the UIView back to the mediated network's SDK. Playing video using
  // SampleNativeAd's playVideo method
  [_nativeAd setNativeAdView:view];
}

إعادة توجيه أحداث التوسّط إلى "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة"

بعد استدعاء GADMediationNativeLoadCompletionHandler مع إعلان تم تحميله، يمكن للمحوِّل استخدام عنصر التفويض GADMediationNativeAdEventDelegate الذي تم عرضه من خلال المحوِّل لإعادة توجيه أحداث العروض التقديمية من حزمة تطوير البرامج (SDK) التابعة لجهة خارجية إلى حزمة "SDK لإعلانات Google على الأجهزة الجوّالة".

ومن المهمّ أن يعيد الحدث المخصّص توجيه أكبر عدد ممكن من عمليات معاودة الاتصال هذه، لكي يتلقّى تطبيقك هذه الأحداث المكافئة من "SDK لإعلانات Google على الأجهزة الجوّالة". في ما يلي مثال على استخدام عمليات معاودة الاتصال:

يُكمل هذا تنفيذ الأحداث المخصّصة للإعلانات المدمجة مع المحتوى. المثال الكامل متاح على GitHub.