原生自定义事件

本指南适用于希望利用AdMob中介功能加载和展示不AdMob受支持的广告联盟提供的原生广告的发布商。 有关如何利用AdMob中介功能加载和展示横幅广告、插页式广告或激励展示广告的信息,请参阅自定义事件

作为中介适配器类,自定义事件能从其他广告联盟请求广告。当其中一个类的名称添加至广告单元的中介设置后,SDK 就可将其实例化,并通过它获取广告。原生自定义事件类需要能够执行以下任务:

  • 从参与中介的广告联盟处请求原生广告。
  • 将事件从参与中介的广告联盟的 SDK 转发至 Google 移动广告 SDK。
  • 使用 GADMediatedUnifiedNativeAd 将参与中介的原生广告对象映射到AdMob的原生广告接口。

下文将介绍如何执行各个任务。在我们的 GitHub 代码库中,您还可以找到示例自定义事件项目的完整源代码。

前提条件

要实现AdMob自定义事件,必须先将移动广告 SDK 集成到您的项目中。您可能还需要了解有关如何发送广告请求以及中介如何运行的信息。

示例 SDK

本指南中使用的代码选自我们的示例自定义事件项目,该项目还包括一个“示例 SDK”。为了说明如何构建一个使用其他广告联盟的 SDK 进行中介的自定义事件,该项目需要一个用于中介的 SDK,因此我们创建了名为“示例 SDK”的模拟 SDK。

示例 SDK 中的类与广告联盟的正式版 SDK 中的类相似。示例 SDK 具有请求对象(例如 SampleNativeAdRequest),广告加载器(例如 SampleNativeAdLoader),以及用于模拟真实广告联盟 SDK 的其他类、常量和协议。不过,示例 SDK 生成的广告是模拟广告,不会产生额外的网络流量。

请求原生广告

requestNativeAdWithParameter:方法

自定义事件类必须实现 GADCustomEventNativeAd 协议,其中包含 Google 移动广告 SDK 用来从自定义事件请求原生广告的方法:

Swift

func request(withParameter serverParameter: String,
                                   request: GADCustomEventRequest,
                                   adTypes: [Any],
                                   options: [Any],
                        rootViewController: UIViewController)

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController;

调用此方法时,自定义事件应异步请求原生广告。requestNativeAdWithParameter: 有四个参数携带了自定义事件在发出请求时可使用的信息:

  • serverParameter - 将自定义事件添加至广告单元的中介配置时,发布商可输入一个会随各个请求一起传递的字符串值。此参数会保留该值(通常是由参与中介的广告联盟签发的另一个广告单元 ID)。
  • request - GADCustomEventRequest 对象,包含单个请求特有的属性,例如,请求了哪些原生格式。 此外,GADCustomEventRequest 还包含用于发布商在请求时提供的定位信息的属性。
  • adTypes - NSArray,包含用于向适配器说明要请求哪些原生格式的常量。对于 UnifiedNativeAd 对象,它应该包含 kGADAdLoaderAdTypeUnifiedNative
  • options - NSArray,包含用于指明发布商广告加载偏好的 GADAdLoaderOptions 对象。

除了携带请求信息的参数外,此方法还有一个 rootViewController 参数,用于提供要在其中展示广告的 UIViewController 的引用。

以下代码段选自我们的示例自定义事件项目,其中显示了已实现的 requestNativeAdWithParameter: 方法:

SampleCustomEventNativeAd(节选)

Swift

func request(withParameter serverParameter: String, request: GADCustomEventRequest, adTypes: [Any], options: [Any], rootViewController: UIViewController) {

  let adLoader = SampleNativeAdLoader()
  let sampleRequest = SampleNativeAdRequest()

  if let options = options as? [GADAdLoaderOptions] {
    for loaderOptions: GADAdLoaderOptions in options {
      if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions {

        sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation = .portrait;
        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 options = loaderOptions as? GADNativeAdViewAdOptions {
        nativeAdViewAdOptions = options
      }
    }
  }
  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter
  adLoader.delegate = self
  adLoader.fetchAd(sampleRequest)
}

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController {
  SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init];
  SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init];

  for (GADNativeAdImageAdLoaderOptions *imageOptions in options) {
    if (![imageOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) {
      continue;
    }

    sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation ==
        GADNativeAdImageAdLoaderOptionsOrientationPortrait;
    sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading;
    sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages;
  }

  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter;
  adLoader.delegate = self;

  [adLoader fetchAd:sampleRequest];
}

这是一个示例自定义事件,它通过模拟的“示例 SDK”将虚构的广告联盟用作中介。该自定义事件利用 requestNativeAdWithParameter: 参数中提供的信息从示例 SDK 的 SampleNativeAdLoader 请求广告。它还将自己分配为 SampleNativeAdLoader 的代理,以便将事件从示例 SDK 转发回 Google 移动广告 SDK。我们将在下一节介绍该过程。

GADAdLoaderOptions

发出原生广告请求时,发布商会提供一个 GADAdLoaderOptions 对象数组,以指定自己对于该请求有何偏好,例如,应使用何种方式返回图片素材资源。系统会进一步将这些对象作为 requestNativeAdWithParameter: 方法的参数之一提供给自定义事件。自定义事件应迭代 options 数组,并应按其中包含的偏好执行操作。

例如,如果 options 数组包含 GADNativeAdImageAdLoaderOptions 对象,且该对象的 shouldDownloadImages 值设置为 true,则自定义事件必须返回实际图片素材资源,而不只是网址。在这种情况下,如果适配的 SDK 只提供图片的网址,那么自定义事件必须通过这些网址下载图片文件,并向发布商提供相关数据。

将事件转发至移动广告 SDK

当自定义事件尝试从参与中介的广告联盟加载原生广告时,可能会发生以下几种情况。SDK 可能会成功返回原生广告,也可能返回错误,或者只报告没有可用的广告。让 Google 移动广告 SDK 知道这些事件非常重要,因此 GADCustomEventNativeAd 协议包含了一个代理(类型为 GADCustomEventNativeAdDelegate),供自定义事件转发事件使用。

自定义事件的一部分功能就是充当“中间人”,即监听参与中介的 SDK 中的事件,然后根据需要向代理发送相应的 GADCustomEventNativeAdDelegate 协议消息。您的自定义事件需要知道以下消息:

  • customEventNativeAd:didReceiveMediatedUnifiedNativeAd: - 此消息应在自定义事件成功加载原生广告时发送。它需要一个类型为 GADMediatedUnifiedNativeAd 的参数,自定义事件应使用该参数传递它刚加载的原生广告的“适配”版本(GADMediatedUnifiedNativeAd 类将在下一节中介绍)。
  • customEventNativeAd:didFailToLoadWithError: - 当自定义事件尝试加载原生广告但未能成功时,应使用此方法报告失败。它需要一个 NSError 参数,其中应包含专门针对此次失败的信息。

以下示例展示了它在我们的示例自定义事件项目中是如何运行的:

SampleCustomEventNativeAd(节选)

Swift

extension SampleCustomEventNativeAdSwift: SampleNativeAdLoaderDelegate {

  func adLoader(_ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd) {
    let mediatedAd = SampleMediatedNativeAdSwift(
    sampleNativeAd:nativeAd,nativeAdViewAdOptions: nativeAdViewAdOptions)
    delegate?.customEventNativeAd(self, didReceive: mediatedAd)
  }

  func adLoader(_ adLoader: SampleNativeAdLoader, didFailToLoadAdWith errorCode: SampleErrorCode) {
    let error = NSError(domain: customEventErrorDomain, code: errorCode.rawValue, userInfo: nil)
    delegate?.customEventNativeAd(self, didFailToLoadWithError: error)
  }

}

Objective-C

@interface SampleCustomEventNativeAd () <SampleNativeAdLoaderDelegate>
@end

@implementation SampleCustomEventNativeAd

@synthesize delegate;

...

#pragma mark SampleNativeAdLoaderDelegate implementation

- (void)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd {
  SampleMediatedNativeAd *mediatedAd =
      [[SampleMediatedNativeAd alloc] initWithSampleNativeAd:nativeAd
                                       nativeAdViewAdOptions:_nativeAdViewAdOptions];
  [self.delegate customEventNativeAd:self didReceiveMediatedUnifiedNativeAd:mediatedAd];
}

- (void)adLoader:(SampleNativeAdLoader *)adLoader
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = [NSError errorWithDomain:customEventErrorDomain code:errorCode userInfo:nil];
  [self.delegate customEventNativeAd:self didFailToLoadWithError:error];
}

...

@end

此类实现了示例 SDK 的 SampleNativeAdLoaderDelegate 协议。 在 SampleCustomEventNativeAd.m(节选)中,自定义事件类本身已分配为 SampleNativeAdLoader 的代理:

Swift

adLoader.delegate = self

Objective-C

adLoader.delegate = self;

这可确保示例 SDK 在有要报告的成功或失败事项时能将消息发送回自定义事件。然后,自定义事件会将相应的消息发送给自己的代理,从而将事件转发到 Google 移动广告 SDK。简而言之,Google 移动广告 SDK 会监听自定义事件,而自定义事件则监听参与中介的 SDK。

上面的 adLoader:didFailToLoadAdWithErrorCode 示例方法很好地诠释了其中的运行方式。当示例 SDK 无法加载广告时,会向自定义事件发送 adLoader:didFailToLoadAdWithErrorCode: 消息。自定义事件会使用示例 SDK 提供的 SampleErrorCode 来创建一个新的 NSError 对象,然后通过 customEventNativeAd:didFailToLoadWithError: 消息将其发送给自己的代理。这样一来,示例 SDK 事件就转变成了 Google 移动广告 SDK 事件。

映射原生广告

对于原生广告,不同的 SDK 都有自己唯一的广告格式。例如,一个 SDK 可能返回包含“title”字段的对象,而另一个 SDK 返回的可能是包含“headline”字段的对象。此外,用于跟踪展示和处理点击的方法也可能会因 SDK 而异。为了消除这些小的差异,当自定义事件从其参与中介的广告联盟的 SDK 接收原生广告对象时,应使用 GADMediatedNativeAd 的子类来“映射”参与中介的 SDK 的原生广告对象,使其与 Google 移动广告 SDK 预期的接口相匹配。

AdMob系统定义的统一原生广告格式具有对应的 GADMediatedUnifiedNativeAd 类。自定义事件应创建此类的子类,以映射其参与中介的 SDK 提供的原生广告对象。

以下是我们的示例自定义事件项目中的一个映射器类示例:

Swift

class SampleMediatedNativeAdSwift: NSObject {

  var sampleAd: SampleNativeAd
  var mappedImages = [GADNativeAdImage]()
  var mappedIcon: GADNativeAdImage?
  var extras = [String: Any]()
  var nativeAdViewAdOptions: GADNativeAdViewAdOptions?
  let adInfoView = SampleAdInfoView()

  init(sampleNativeAd: SampleNativeAd, nativeAdViewAdOptions: GADNativeAdViewAdOptions?) {

    sampleAd = sampleNativeAd
    super.init()

    extras = [SampleCustomEventConstantsSwift.awesomenessKey: sampleAd.degreeOfAwesomeness ?? ""]
    if let image = sampleAd.image {
      mappedImages = [GADNativeAdImage(image: image)]
    }
    else {
      let imageUrl = URL(fileURLWithPath: sampleAd.imageURL)
      mappedImages = [GADNativeAdImage(url: imageUrl, scale: sampleAd.imageScale)]
    }
    if let icon = sampleAd.icon {
      mappedIcon = GADNativeAdImage(image: icon)
    }
    else {
      let iconURL = URL(fileURLWithPath: sampleNativeAd.iconURL)
      mappedIcon = GADNativeAdImage(url: iconURL, scale: sampleAd.iconScale)
    }
    self.nativeAdViewAdOptions = nativeAdViewAdOptions
  }

}

extension SampleMediatedNativeAdSwift : GADMediatedUnifiedNativeAd {

  var advertiser : String? {
    return sampleAd.advertiser
  }

  var headline : String? {
    return sampleAd.headline
  }

  var images : [GADNativeAdImage]? {
    return mappedImages
  }

  var body : String? {
    return sampleAd.body
  }

  var icon : GADNativeAdImage? {
    return mappedIcon
  }

  var callToAction : String? {
    return sampleAd.callToAction
  }

  var starRating : NSDecimalNumber? {
    return sampleAd.starRating
  }

  var store : String? {
    return sampleAd.store
  }

  var price : String? {
    return sampleAd.price
  }

  var extraAssets : [String : Any]? {
    return extras
  }

  var adChoicesView : UIView? {
    return adInfoView
  }

  func didRecordImpression() {
    sampleAd.recordImpression()
  }

// Because the Sample SDK has click and impression tracking via
// methods on its native ad object which the developer is required to
// call, there's no need to pass it a reference to the UIView being
// used to display the native ad. So there's no need to implement
// didRenderInView:viewController here. If your mediated network does
// need a reference to the view, this method can be used to provide one.
  func didRender(in view: UIView,
                    clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                    nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : 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.
  }

  func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier,
                                      view: UIView,
                                      viewController: UIViewController) {
    sampleAd.handleClick(on: view)
  }

  func didUntrackView(_ view: UIView?) {
    // This method is called when the mediatedNativeAd is no longer
    // rendered in the provided view. Here you would remove any tracking
    // from the view that has mediated native ad.
  }
}

Objective-C

// SampleMediatedNativeAppAd.h (excerpt)

@interface SampleMediatedNativeAd : NSObject<GADMediatedUnifiedNativeAd>

- (nullable instancetype)initWithSampleNativeAd:(nonnull SampleNativeAd *)sampleNativeAd
                          nativeAdViewAdOptions:
                              (nullable GADNativeAdViewAdOptions *)nativeAdViewAdOptions;

@end

// SampleMediatedNativeAd.m (excerpt)

@implementation SampleMediatedNativeAd

- (instancetype)initWithSampleNativeAd:(SampleNativeAd *)sampleNativeAd
                 nativeAdViewAdOptions:(nullable GADNativeAdViewAdOptions *)nativeAdViewAdOptions {
  if (!sampleNativeAd) {
    return nil;
  }

  self = [super init];
  if (self) {
    _sampleAd = sampleNativeAd;
    _extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

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

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

    _nativeAdViewAdOptions = nativeAdViewAdOptions;
  }
  return self;
}

- (NSString *)advertiser {
  return self.sampleAd.advertiser;
}

- (NSString *)headline {
  return self.sampleAd.headline;
}

- (NSArray *)images {
  return self.mappedImages;
}

- (NSString *)body {
  return self.sampleAd.body;
}

- (GADNativeAdImage *)icon {
  return self.mappedIcon;
}

- (NSString *)callToAction {
  return self.sampleAd.callToAction;
}

- (NSDecimalNumber *)starRating {
  return self.sampleAd.starRating;
}

- (NSString *)store {
  return self.sampleAd.store;
}

- (NSString *)price {
  return self.sampleAd.price;
}

- (NSDictionary *)extraAssets {
  return self.extras;
}

// Because the Sample SDK has click and impression tracking via methods
// on its native ad object which the developer is required to call,
// there's no need to pass it a reference to the UIView being used to
// display the native ad. So there's no need to implement
// mediatedNativeAd:didRenderInView:viewController:clickableAssetViews:nonC
// lickableAssetViews here. If your mediated network does need a
// reference to the view, this method can be used to provide one. You
// can also access the clickable and non-clickable views by asset key if
// the mediation network needs this information.
- (void)didRenderInView:(UIView *)view
       clickableAssetViews:
           (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
    nonclickableAssetViews:
        (NSDictionary<GADUnifiedNativeAssetIdentifier, 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.

  if (!_adInfoView) {
    _adInfoView = [[SampleAdInfoView alloc] init];
  }

  [view addSubview:_adInfoView];
  [self updateAdInfoViewPositionInSuperView:view];
}

- (void)didUntrackView:(UIView *)view {
  // This method is called when the mediatedNativeAd is no longer
  // rendered in the provided view. Here you would remove any tracking
  // from the view that has mediated native ad.

  // Remove the previously added AdChoices view from the ad view.
  if (!_adInfoView) {
    [_adInfoView removeFromSuperview];
  }
}

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

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

下面我们先介绍初始化函数及其执行的一些操作。

保留对参与中介的原生广告对象的引用

初始化函数接受 SampleNativeAd 的实例,并将其用作自己的唯一参数。这是一种原生广告类,供示例 SDK 用于其原生广告。映射器需要使用对参与中介的广告对象的引用,以便传递点击和展示事件,因此它会将其存储为 sampleAd

创建 NSDictionary 以保留额外素材资源

除了AdMob原生广告格式中的素材资源之外,一些参与中介的广告联盟可能还会提供额外的素材资源。GADMediatedUnifiedNativeAd 协议包含一个称为 extraAssets 的方法,Google 移动广告 SDK 使用该方法从您的映射器中获取所有这些“额外”素材资源。上面的初始化函数会创建一个 NSDictionary,并在其中填充示例 SDK 提供的额外素材资源(在本例中,是一个称为 degreeOfAwesomenessNSString 值)。稍后,extraAssets 方法会将此 NSDictionary 用作返回值:

Swift

extras = [SampleCustomEventExtraKeyAwesomeness : sampleAd.degreeOfAwesomeness]

Objective-C

_extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

映射图片素材资源

与映射较为简单的数据类型(如 NSStringdouble)相比,映射图片素材资源会稍微复杂一点。图片既可以自动下载,也可以仅作为网址值返回,而且其像素密度也会变化。为了帮助自定义事件开发者管理这些详细信息,Google 移动广告 SDK 提供了GADNativeAdImage 类。开发者应该使用此类将图片素材资源信息(无论是实际的 UIImage 对象还是 NSURL 值)返回给 Google 移动广告 SDK。以下示例展示了映射器类如何创建 GADNativeAdImage 来保留应用安装广告的图标图片:

Swift

if let icon = sampleAd.icon {
  mappedIcon = GADNativeAdImage(image: icon)
} else {
  let iconURL = URL(fileURLWithPath: sampleNativeAppInstallAd.iconURL)
  mappedIcon = GADNativeAdImage(url: iconURL, scale: sampleAd.iconScale)
}

Objective-C

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

您应该还记得我们在有关如何发送请求的章节介绍过,发布商可以使用 GADNativeAdImageAdLoaderOptions 对象来指定系统不应自动下载原生广告图片。在上面的示例中,映射器会检查图片是否已经下载,并使用适当的信息(UIImage 或匹配的 NSURL 和比例值对)创建 GADNativeAdImage

介绍完初始化函数后,我们再来看看此类中的其他方面。

返回映射的素材资源

此映射器类继承了 GADMediatedUnifiedNativeAd 的方法,这些方法与原生广告的预期素材资源相对应。Google 移动广告 SDK 会调用这些方法来获取素材资源,因此您的映射器类应返回相应的值。对于大多数素材资源而言,这是非常简单的操作:

Swift

var headline : String? {
  return sampleAd.headline
}

Objective-C

- (NSString *)headline {
  return self.sampleAd.headline;
}

然而,对于某些素材资源,数据类型可能不匹配,或者可能需要进行其他类型的转换。处理这些详细信息是映射器的任务,而素材资源方法很适合完成该任务。

广告选择

适配器负责提供“广告选择”图标。adChoicesView 方法是 GADMediatedNativeAppInstallAdGADMediatedNativeContentAd 协议的可选方法。实现该方法后,SDK 将采用提供的广告选择视图,并在原生广告中展示。下面展示的是如何提供“广告选择”图标的实现示例:

Swift

class SampleMediatedNativeAd: NSObject, GADMediatedUnifiedNativeAd {
  /// Ad networks should provide their own AdChoices view.
  private var adChoicesView: SampleAdChoicesView?

  var adChoicesView : UIView? {
      return adChoicesView
  }

Objective-C

@interface SampleMediatedNativeAd ()<GADMediatedUnifiedNativeAd> {

  /// Ad networks should provide their own AdChoices view.
  SampleAdChoicesView *_adChoicesView;

}

@implementation SampleMediatedNativeAd

- (UIView *)adChoicesView {
  return _adInfoView;
}

展示和点击事件

无论何时发生展示或点击,都必须让参与中介的广告联盟的 SDK 收到通知,这一点很重要。因此,映射器类负责向参与中介的广告联盟 SDK 提供自行处理展示和点击跟踪所需的信息,或者在发生展示或点击时明确通知参与中介的广告联盟 SDK。

如果参与中介的原生广告对象提供了记录点击和展示的方法,则自定义事件的映射器类可以使用这些方法。这是最常见的做法。GADMediatedUnifiedNativeAd 包含 didRecordImpression:didRecordClickOnAssetWithName:view:viewController: 两种方法,映射器应替换和使用这些方法来调用参与中介的原生广告对象上的相应方法。

SampleMediatedNativeAd 的处理方式如下所示:

Swift

func didRecordImpression() {
  sampleAd.recordImpression()
}

func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier,
                                    view: UIView,
                                    viewController: UIViewController) {
  sampleAd.handleClick(on: view)
}

Objective-C

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

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

SampleMediatedNativeAd 保留了对示例 SDK 的原生广告对象的引用,因此可轻松调用该对象上的相应方法来报告点击或展示。

让参与中介的 SDK 跟踪点击和展示

对于需要自行跟踪点击和展示的广告联盟,GADCustomEventNativeAd 协议提供两种可选消息:handlesUserClickshandlesUserImpressions。如果其中一种消息返回 YES,则表示自定义事件会自行跟踪对应类型的事件。如果返回 NO 或无响应,则表示 Google 移动广告 SDK 应代表自定义事件来跟踪点击和展示,并使用 GADMediatedUnifiedNativeAd 上的 didRecordImpression:didRecordClickOnAssetWithName: 进行报告。

自行跟踪点击或展示的自定义事件可以使用 GADMediatedUnifiedNativeAd 协议中的 didRenderInView: 消息,将原生广告视图传递给参与中介的 SDK 的原生广告对象,以便参与中介的 SDK 可以用其进行实际跟踪。到目前为止,本指南的代码示例中显示的示例 SDK 尚未使用此方式来处理点击和展示。如果使用,则相应的 didRenderInView: 方法应如下所示:

Swift

func didRender(in view: UIView,
                  clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  viewController: UIViewController) {
  sampleAd?.setNativeAdView(view)
}

Objective-C

- (void)didRenderInView:(UIView *)view
       clickableAssetViews:
           (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
    nonclickableAssetViews:
        (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)nonclickableAssetViews
            viewController:(UIViewController *)viewController {
  [self.sampleAd setNativeAdView:view];
}

GADMediatedUnifiedNativeAd 还包含 didUntrackView:,它的目的完全相反。通过实现此方法,自定义事件可释放对视图的任何引用,并在可能的情况下解除它与原生广告对象之间的关联。

GADMediatedNativeAdNotificationSource

为了让参与中介的原生广告报告演示屏幕或记录点击等事件,SDK 提供了 GADMediatedNativeAdNotificationSource 类。该类包含六个类方法,分别对应于参与中介的原生广告生命周期中的各种事件,每个方法都会引用对应的广告对象:

  • mediatedNativeAdDidRecordImpression: - 对于自行跟踪展示的自定义事件,此方法应由其参与中介的原生广告调用,以便将展示报告回 Google 移动广告 SDK。这是实现报告目的所必需的方法。
  • mediatedNativeAdDidRecordClick: - 与上一方法类似,对于自行跟踪点击的自定义事件,应让其参与中介的原生广告调用此方法,以便报告发生的点击。
  • mediatedNativeAdWillPresentScreen: - 必须在参与中介的原生广告即将打开应用内模态屏幕之前调用此方法。
  • mediatedNativeAdWillDismissScreen: - 必须在由参与中介的原生广告打开的应用内模态屏幕即将关闭之前调用此方法。
  • mediatedNativeAdDidDismissScreen: - 必须在由参与中介的原生广告打开的应用内模态屏幕关闭之后调用此方法。
  • mediatedNativeAdWillLeaveApplication: - 必须在参与中介的原生广告即将引导用户离开应用(例如在 Safari 中打开目标网址)之前调用此方法。

使用自定义事件

要使用自定义事件,您需要将其添加至广告单元的中介配置。这可在AdMob 界面中完成。(有关修改广告单元的中介配置的详细说明,请查阅创建自定义事件)。

在将自定义事件添加至广告单元的中介配置时,系统会要求您提供三项信息:

  • Class Name - 这是您自定义事件的类名称。
  • Label - 这是您希望AdMob界面在展示广告单元的中介来源时用于代表自定义事件的标签。 它是您的专属标签,因为它仅会显示在 AdMob.com 上。
  • Parameter - 这是一个字符串值,每当针对该广告单元发出请求时,系统就会将其传递给相应的自定义事件。通常情况下,此字符串值设置为参与中介的广告联盟提供的广告单元 ID。

以下是示例自定义事件条目的屏幕截图:

就这么简单!至此,您已学习了为AdMob编写您自己的 iOS 自定义事件所需的全部内容。

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面