原生广告 - 自定义呈现

此功能目前仅在有限范围内进行测试。如果您有兴趣参与测试,请与您的客户经理联系,讨论是否可行。此功能将在测试结束后提供给所有发布商。

本指南将向您介绍如何使用 Google 移动广告 SDK 在 iOS 应用中实现 DFP 原生广告以及一些需要考虑的重要事项。

前提条件

本指南假定您已经掌握了一些 Google 移动广告 SDK 的应用知识。如果没有的话,不妨先通读我们的入门指南

什么是原生广告?

原生广告是通过平台自身的界面组件向用户呈现的广告。它们使用您已在 storyboard 中使用的相同类进行展示,并且可以设置格式,从而与应用的视觉设计相匹配。加载原生广告后,您的应用会收到包含其素材资源的原生广告对象,然后由应用(而不是 SDK)负责展示它们。

系统定义的原生广告格式

有两种系统定义的原生广告格式:应用安装广告和内容广告。应用安装广告由 GADNativeAppInstallAd 表示,内容广告由 GADNativeContentAd 表示。类的实例包含原生广告的素材资源。

自定义原生广告格式

除了系统定义的原生广告格式,DFP 广告管理系统(以下简称 DFP)发布商还可以通过定义素材资源的自定义列表来生成自己的原生广告格式。这些称为自定义原生广告格式,可用于直销原生广告。自定义原生广告格式允许发布商将任意结构化数据传递到其应用。这些广告由 GADNativeCustomTemplateAd 类表示。

自定义原生广告格式也称为自定义模板广告。这是因为发布商为自定义原生广告格式定义了自己的“模板”(素材资源名称和类型列表)。在您逐步学习本指南的过程中,这一点将变得更加清晰,不过现在只需记住,“自定义模板广告”和“自定义原生广告格式”都指的是同一种广告。

加载系统定义的原生广告格式

原生广告通过 GADAdLoader 对象加载,这些对象根据 GADAdLoaderDelegate 协议向它们的委托发送消息。

初始化 GADAdLoader

以下代码演示了如何为应用安装广告初始化 GADAdLoader

Objective-C

self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"/6499/example/native"
    rootViewController:rootViewController
               adTypes:@[ ... ad type constants ... ]
               options:@[ ... ad loader options objects ... ]];
self.adLoader.delegate = self;

Swift

adLoader = GADAdLoader(adUnitID: "/6499/example/native",
    rootViewController: self,
    adTypes: [ ... ad type constants ... ],
    options: [ ... ad loader options objects ... ])
adLoader.delegate = self

adTypes 数组参数允许您的应用传递常量,这些常量用于指定应用要请求的原生广告格式。数组应包含一个或多个以下常量:

  • kGADAdLoaderAdTypeNativeAppInstall
  • kGADAdLoaderAdTypeNativeContent
  • kGADAdLoaderAdTypeNativeCustomTemplate

请求原生广告

初始化 GADAdLoader 后,调用其 loadRequest: 方法请求广告:

Objective-C

[self.adLoader loadRequest:[DFPRequest request]];

Swift

adLoader.loadRequest(DFPRequest())

GADAdLoader 中的 loadRequest 方法接受与横幅和插页式广告相同的 DFPRequest 对象。您可以和处理其他广告类型一样,使用请求对象添加定位信息

一个 GADAdLoader 可以发出多个请求,但前提是它们一次完成一个请求。重复使用 GADAdLoader 时,请确保等待每个请求完成,然后再次调用 loadRequest 以开始下一个请求。如果您需要同时请求多个广告,则可以使用多个 GADAdLoader 对象。

GADAdLoaderDelegate 协议

对于您请求的每种原生广告格式,广告加载程序委托都需要实现相应的协议:

GADNativeAppInstallAdLoaderDelegate

此协议包括在加载应用安装广告时发送给委托的消息:

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAppInstallAd:(GADNativeAppInstallAd *)nativeAppInstallAd;

Swift

public func adLoader(adLoader: GADAdLoader!,
    didReceiveNativeAppInstallAd nativeAppInstallAd: GADNativeAppInstallAd!)

GADNativeContentAdLoaderDelegate

此参数定义了在加载内容广告时发送的消息:

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeContentAd:(GADNativeContentAd *)nativeContentAd;

Swift

public func adLoader(adLoader: GADAdLoader!,
    didReceiveNativeContentAd nativeContentAd: GADNativeContentAd!)

处理失败的请求

上述协议扩展了 GADAdLoaderDelegate 协议,定义了当广告无法加载时发送的消息:

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didFailToReceiveAdWithError:(GADRequestError *)error;

Swift

public func adLoader(adLoader: GADAdLoader!,
    didFailToReceiveAdWithError error: GADRequestError!)

您可以使用 GADRequestError 对象来确定错误的原因。

原生广告选项

上述 GADAdLoader 的创建过程中包含的最后一个参数是一个可选的对象数组:

Objective-C

self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"/6499/example/native"
    rootViewController:rootViewController
               adTypes:@[ ... ad type constants ... ]
               options:@[ ... ad loader options objects ... ]];

Swift

adLoader = GADAdLoader(adUnitID: "/6499/example/native",
    rootViewController: self,
    adTypes: [ ... ad type constants ... ],
    options: [ ... ad loader options objects ... ])

GADNativeAdImageAdLoaderOptions 包含与原生广告中的图片相关的属性。通过创建 GADNativeAdImageAdLoaderOptions 对象、设置其属性并在初始化期间传入此对象,应用可以来控制 GADAdLoader 处理原生广告图片资源的方式。

GADNativeAdImageAdLoaderOptions 具有以下属性:

disableImageLoading - 通过包含 imageimageURL 属性的 GADNativeAdImage 实例返回原生广告的图片资源。如果 disableImageLoading 设置为 false(默认),SDK 将自动获取图片资源,并为您填充 imageimageURL 属性。不过,如果设置为 true,SDK 将只填充 imageURL,允许您自行决定是否下载实际图片。

preferredImageOrientation - 某些广告素材有多张可用图片,分别适用于不同的设备屏幕方向。应用可以通过将此属性设置为某个方向常量来请求特定方向的图片:

  • GADNativeAdImageAdLoaderOptionsOrientationAny
  • GADNativeAdImageAdLoaderOptionsOrientationLandscape
  • GADNativeAdImageAdLoaderOptionsOrientationPortrait

如果未调用此方法,将使用默认值 GADNativeAdImageAdLoaderOptionsOrientationAny

shouldRequestMultipleImages - 某些图片资源会包含一系列图片,而不只是一个。将此值设置为 true,则您的应用指示它已准备好展示任何包含多个图片的素材资源的所有图片。将其设置为 false(默认),您的应用会指示 SDK 仅提供任何包含一系列图片的素材资源中的第一张图片。

如果在初始化 GADAdLoader 时未传入 GADAdLoaderOptions 对象,则将使用每个选项的默认值。

GADNativeAdViewOptions

GADNativeAdViewAdOptions 包含 preferredAdChoicesPosition 属性,发布商可以使用该属性来指定应放置广告选择图标的位置。该图标可以显示在广告的任一角,默认为 GADAdChoicesPositionTopRightCorner

以下示例展示了如何将广告选择图标放置在广告的左上角:

Objective-C

GADNativeAdViewAdOptions *adViewOptions = [[GADNativeAdViewAdOptions alloc] init];
adViewOptions.preferredAdChoicesPosition = GADAdChoicesPositionTopLeftCorner;
self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"/6499/example/native"
    rootViewController:self
               adTypes:@[ kGADAdLoaderAdTypeNativeAppInstall, kGADAdLoaderAdTypeNativeContent ]
               options:@[ adViewOptions ]];

Swift

let adViewOptions = GADNativeAdViewAdOptions()
adViewOptions.preferredAdChoicesPosition = .TopLeftCorner
adLoader = GADAdLoader(adUnitID: "/6499/example/native",
    rootViewController: self,
    adTypes: [ kGADAdLoaderAdTypeNativeAppInstall, kGADAdLoaderAdTypeNativeContent],
    options: [ adViewOptions ])

何时请求广告

展示原生广告的应用可以在实际展示之前请求这些广告。在许多情况下,这是推荐的做法。例如,如果应用展示其中包含原生广告的项目列表,则可以针对整个列表加载原生广告,并且知道一些广告将仅在用户滚动视图之后展示,而一些可能根本不会展示。

预提取广告是一项便利的技术,但发布商要注意不要永远保留旧广告,而不进行展示。对任何原生广告对象来说,如果在保留一小时后仍没有获得展示,就应该被舍弃,并替换为来自新请求的新广告。

展示系统定义的原生广告格式

加载原生广告后,您的应用会通过 GADAdLoaderDelegate 协议消息之一接收原生广告对象。然后,由您的应用负责展示广告,但不一定要立即执行。为了方便展示系统定义的广告格式,SDK 提供了一些有用的资源。

广告视图类

对于每种系统定义的格式,都有一个相应的“广告视图”类:应用安装广告为 GADNativeAppInstallAdView,内容广告为 GADNativeContentAdView。这些广告视图类是 UIViews,发布商应该使用它们来展示相应格式的原生广告。例如,单个 GADNativeAppInstallAdView 可以展示 GADNativeAppInstallAd 的单个实例。用于展示该广告素材资源的每个 UIView 都应为 GADNativeAppInstallAdView 对象的子对象。

例如,如果您在 UITableView 中展示应用安装广告,则其中一个单元格的视图层次结构可能如下所示:

广告视图类还提供了用于注册每个单独的素材资源所用视图的 IBOutlets 以及一个用于注册 GADNativeAd 对象本身的方法。以这种方式注册视图和原生广告对象允许 SDK 自动处理以下任务:

  • 记录点击次数
  • 记录展示次数(当第一个像素出现在屏幕上时)
  • 为原生补余广告素材显示广告选择叠加层

广告选择叠加层

对于非直销原生广告(通过 DFP 补余广告、Ad Exchange 或 AdSense 投放的广告),SDK 会添加广告选择叠加层。请在原生广告视图您偏好的角中留出空间,以便自动插入广告选择徽标。此外,在将广告选择叠加层放置在广告内容上时,请确保用户可以轻松看到该图标。有关叠加层外观和功能的详细信息,请参阅原生补余广告实现指南

代码示例

让我们来了解一下如何使用从 xib 文件动态加载的视图来展示原生广告。此方法非常适合使用经过配置的 GADAdLoaders 请求多种广告格式的情况。

在 xib 文件中布置 UIViews

第一步是布置显示原生广告素材资源的 UIViews。与创建任何其他 xib 文件时一样,您可以在 Interface Builder 中执行此操作。应用安装广告的布局方式如下所示:

内容广告的布局方式如下所示:

请注意两个图片右上角的自定义类值。它设置为 GADNativeAppInstallAdViewGADNativeContentAdView。这些是用于显示 GADNativeAppInstallAdGADNativeContentAd 的广告视图类。对于系统定义的格式,您需要使用与您希望该布局所展示广告格式相匹配的广告视图类。

将输出口与视图关联

视图就位且已将正确的广告视图类分配到布局后,您需要将广告视图的素材资源输出口与您创建的 UIViews 关联起来。以下是将广告视图的素材资源输出口与为应用安装广告创建的 UIViews 相关联的方法:

以下是将广告视图的素材资源输出口与为内容广告创建的 UIViews 相关联的方法:

在输出口面板中,GADNativeAppInstallAdViewGADNativeContentAdView 中的输出口已与 Interface Builder 中布置的 UIViews 相关联。这使 SDK 可以了解哪个 UIView 显示哪个素材资源。同时请务必注意,这些输出口表示广告中可点击的视图。

展示广告

完成布局并关联输出口后,最后一步是向应用添加代码,以便在加载广告后进行展示。以下是在上述视图中展示应用安装广告的方法:

Objective-C

#pragma mark GADNativeAppInstallAdLoaderDelegate implementation

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAppInstallAd:(GADNativeAppInstallAd *)nativeAppInstallAd {
  // Create and place ad in view hierarchy.
  GADNativeAppInstallAdView *appInstallAdView =
      [[[NSBundle mainBundle] loadNibNamed:@"NativeAppInstallAdView"
                                     owner:nil
                                   options:nil] firstObject];
  // TODO: Make sure to add the GADNativeAppInstallAdView to the view hierarchy.

  // Associate the app install ad view with the app install ad object. This is required to make the
  // ad clickable.
  appInstallAdView.nativeAppInstallAd = nativeAppInstallAd;

  // Populate the app install ad view with the app install ad assets.
  // Some assets are guaranteed to be present in every app install ad.
  ((UILabel *)appInstallAdView.headlineView).text = nativeAppInstallAd.headline;
  ((UIImageView *)appInstallAdView.iconView).image = nativeAppInstallAd.icon.image;
  ((UILabel *)appInstallAdView.bodyView).text = nativeAppInstallAd.body;
  ((UIImageView *)appInstallAdView.imageView).image =
      ((GADNativeAdImage *)[nativeAppInstallAd.images firstObject]).image;
  [((UIButton *)appInstallAdView.callToActionView)setTitle:nativeAppInstallAd.callToAction
                                                  forState:UIControlStateNormal];

  // Other assets are not, however, and should be checked first.
  if (nativeAppInstallAd.starRating) {
    ((UIImageView *)appInstallAdView.starRatingView).image =
        [self imageForStars:nativeAppInstallAd.starRating];
    appInstallAdView.starRatingView.hidden = NO;
  } else {
    appInstallAdView.starRatingView.hidden = YES;
  }

  if (nativeAppInstallAd.store) {
    ((UILabel *)appInstallAdView.storeView).text = nativeAppInstallAd.store;
    appInstallAdView.storeView.hidden = NO;
  } else {
    appInstallAdView.storeView.hidden = YES;
  }

  if (nativeAppInstallAd.price) {
    ((UILabel *)appInstallAdView.priceView).text = nativeAppInstallAd.price;
    appInstallAdView.priceView.hidden = NO;
  } else {
    appInstallAdView.priceView.hidden = YES;
  }

  // In order for the SDK to process touch events properly, user interaction should be disabled on
  // all views associated with the GADNativeAppInstallAdView. Since UIButton has
  // userInteractionEnabled set to YES by default, views of this type must explicitly set
  // userInteractionEnabled to NO.
  appInstallAdView.callToActionView.userInteractionEnabled = NO;
}

Swift

// Mark: - GADNativeAppInstallAdLoaderDelegate

func adLoader(adLoader: GADAdLoader!,
    didReceiveNativeAppInstallAd nativeAppInstallAd: GADNativeAppInstallAd!) {
  // Create and place the ad in the view hierarchy.
  let appInstallAdView = NSBundle.mainBundle().loadNibNamed("NativeAppInstallAdView", owner: nil,
      options: nil).first as! GADNativeAppInstallAdView
  // TODO: Make sure to add the GADNativeAppInstallAdView to the view hierarchy.

  // Associate the app install ad view with the app install ad object. This is required to make
  // the ad clickable.
  appInstallAdView.nativeAppInstallAd = nativeAppInstallAd

  // Populate the app install ad view with the app install ad assets.
  // Some assets are guaranteed to be present in every app install ad.
  (appInstallAdView.headlineView as! UILabel).text = nativeAppInstallAd.headline
  (appInstallAdView.iconView as! UIImageView).image = nativeAppInstallAd.icon?.image
  (appInstallAdView.bodyView as! UILabel).text = nativeAppInstallAd.body
  (appInstallAdView.imageView as! UIImageView).image =
      (nativeAppInstallAd.images?.first as! GADNativeAdImage).image
  (appInstallAdView.callToActionView as! UIButton).setTitle(
      nativeAppInstallAd.callToAction, forState: UIControlState.Normal)

  // Other assets are not, however, and should be checked first.
  let starRatingView = appInstallAdView.starRatingView
  if let starRating = nativeAppInstallAd.starRating {
    (starRatingView as! UIImageView).image = imageOfStarsFromStarRating(starRating)
    starRatingView.hidden = false
  } else {
    starRatingView.hidden = true
  }

  let storeView = appInstallAdView.storeView
  if let store = nativeAppInstallAd.store {
    (storeView as! UILabel).text = store
    storeView.hidden = false
  } else {
    storeView.hidden = true
  }

  let priceView = appInstallAdView.priceView
  if let price = nativeAppInstallAd.price {
    (priceView as! UILabel).text = price
    priceView.hidden = false
  } else {
    priceView.hidden = true
  }

  // In order for the SDK to process touch events properly, user interaction should be disabled on
  // all views associated with the GADNativeAppInstallAdView. Since UIButton has
  // userInteractionEnabled set to true by default, views of this type must explicitly set
  // userInteractionEnabled to false.
  (appInstallAdView.callToActionView as! UIButton).userInteractionEnabled = false
}

以下是在上述视图中展示内容广告的方法:

Objective-C

#pragma mark GADNativeContentAdLoaderDelegate implementation

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeContentAd:(GADNativeContentAd *)nativeContentAd {
  // Create and place ad in view hierarchy.
  GADNativeContentAdView *contentAdView =
      [[[NSBundle mainBundle] loadNibNamed:@"NativeContentAdView"
                                     owner:nil
                                   options:nil] firstObject];
  // TODO: Make sure to add the GADNativeContentAdView to the view hierarchy.

  // Associate the content ad view with the content ad object. This is required to make the ad
  // clickable.
  contentAdView.nativeContentAd = nativeContentAd;

  // Populate the content ad view with the content ad assets.
  // Some assets are guaranteed to be present in every content ad.
  ((UILabel *)contentAdView.headlineView).text = nativeContentAd.headline;
  ((UILabel *)contentAdView.bodyView).text = nativeContentAd.body;
  ((UIImageView *)contentAdView.imageView).image =
      ((GADNativeAdImage *)[nativeContentAd.images firstObject]).image;
  ((UILabel *)contentAdView.advertiserView).text = nativeContentAd.advertiser;
  [((UIButton *)contentAdView.callToActionView)setTitle:nativeContentAd.callToAction
                                               forState:UIControlStateNormal];

  // Other assets are not, however, and should be checked first.
  if (nativeContentAd.logo && nativeContentAd.logo.image) {
    ((UIImageView *)contentAdView.logoView).image = nativeContentAd.logo.image;
    contentAdView.logoView.hidden = NO;
  } else {
    contentAdView.logoView.hidden = YES;
  }

  // In order for the SDK to process touch events properly, user interaction should be disabled on
  // all views associated with the GADNativeContentAdView. Since UIButton has userInteractionEnabled
  // set to YES by default, views of this type must explicitly set userInteractionEnabled to NO.
  contentAdView.callToActionView.userInteractionEnabled = NO;
}

Swift

// Mark: - GADNativeContentAdLoaderDelegate

func adLoader(adLoader: GADAdLoader!,
    didReceiveNativeContentAd nativeContentAd: GADNativeContentAd!) {
  // Create and place the ad in the view hierarchy.
  let contentAdView = NSBundle.mainBundle().loadNibNamed("NativeContentAdView", owner: nil,
      options: nil).first as! GADNativeContentAdView
  // TODO: Make sure to add the GADNativeContentAdView to the view hierarchy.

  // Associate the content ad view with the content ad object. This is required to make the ad
  // clickable.
  contentAdView.nativeContentAd = nativeContentAd

  // Populate the content ad view with the content ad assets.
  // Some assets are guaranteed to be present in every content ad.
  (contentAdView.headlineView as! UILabel).text = nativeContentAd.headline
  (contentAdView.bodyView as! UILabel).text = nativeContentAd.body
  (contentAdView.imageView as! UIImageView).image =
      (nativeContentAd.images?.first as! GADNativeAdImage).image
  (contentAdView.advertiserView as! UILabel).text = nativeContentAd.advertiser
  (contentAdView.callToActionView as! UIButton).setTitle(
      nativeContentAd.callToAction, forState: UIControlState.Normal)

  // Other assets are not, however, and should be checked first.
  let logoView = contentAdView.logoView
  if let logoImage = nativeContentAd.logo?.image {
    (logoView as! UIImageView).image = logoImage
    logoView.hidden = false
  } else {
    logoView.hidden = true
  }

  // In order for the SDK to process touch events properly, user interaction should be disabled on
  // all views associated with the GADNativeContentAdView. Since UIButton has userInteractionEnabled
  // set to true by default, views of this type must explicitly set userInteractionEnabled to false.
  (contentAdView.callToActionView as! UIButton).userInteractionEnabled = false
}

如您所见,上面的代码示例停用了展示号召性用语的 UIButton 的用户互动。如果您使用 UIButton 展示原生广告素材资源,则还需要停用其用户互动,以便 Google 移动广告 SDK 可以正常接收和处理界面事件。由于有这个额外的步骤,通常最好完全避免使用 UIButton,而是使用 UILabel 和 UIImageView。

我们的 GitHub 存储区包含以 Swift 和 Objective-C 编写的原生自定义呈现应用安装广告和内容广告的完整实现。

下载 DFP 自定义呈现示例

加载自定义原生广告格式

与系统定义的原生广告类似,自定义原生广告格式也是使用 GADAdLoader 对象加载。初始化 GADAdLoader 时在 adTypes 数组中包含 kGADAdLoaderAdTypeNativeCustomTemplate 常量会将其配置为在加载广告时请求自定义原生广告格式。

GADNativeCustomTemplateAdLoaderDelegate

加载自定义模板的协议有两种方法。第一个用于 GADAdLoader,以找出它应该请求哪些模板 ID:

Objective-C

- (NSArray *)nativeCustomTemplateIDsForAdLoader:(GADAdLoader *)adLoader;

Swift

public func nativeCustomTemplateIDsForAdLoader(adLoader: GADAdLoader!) -> [AnyObject]!

每个自定义原生广告格式都有用于标识它的相应模板 ID。调用此方法时,您的应用应返回一个数组,其中包含准备展示的格式的模板 ID。

第二条消息在自定义模板广告加载后发送,这与系统定义的格式非常相似:

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeCustomTemplateAd:(GADNativeCustomTemplateAd *)nativeCustomTemplateAd;

Swift

public func adLoader(adLoader: GADAdLoader!,
    didReceiveNativeCustomTemplateAd nativeCustomTemplateAd: GADNativeCustomTemplateAd!)

模板 ID

可以在 DFP 界面投放标签的广告素材 > 原生广告格式部分找到用于唯一引用原生自定义广告格式的模板 ID:

每个自定义原生广告格式的模板 ID 显示在其名称下方。点击其中一个名称可以转到详细信息屏幕,其中显示有关模板字段的信息:

从这里,可以添加、修改和移除各个字段。请注意右侧的“变量 ID”列。这些 ID 用于访问各个素材资源,具体细节将在下一部分讨论。

展示自定义原生广告格式

自定义原生广告格式与系统定义的原生广告格式的不同之处在于,发布商有权定义自己的构成广告的“模板”(即素材资源列表)。因此,与系统定义的格式相比,展示自定义原生广告的过程在以下几个方面有所不同:

  1. 因为 GADNativeCustomTemplateAd 用于处理您创建的任何自定义原生广告格式,因此它没有命名的素材资源存取器,而是提供了 imageForKey:stringForKey: 等方法,它们将模板字段的变量 ID 作为参数。
  2. 没有类似 GADNativeContentAdView 的专用广告视图类用于 GADNativeCustomTemplateAd。您可以随意使用适合您的用户体验的任何接口。
  3. 由于没有专用的广告视图类,因此您不需要注册任何用于展示广告素材资源的视图。

以下是可以展示简单的 GADNativeCustomTemplateAd 的类的例子:

MySimpleNativeAdView.h

Objective-C

@import UIKit;
@import GoogleMobileAds;

/// View representing a custom native ad format with template ID 10063170.
@interface MySimpleNativeAdView : UIView

// Weak references to this ad's asset views.
@property(weak, nonatomic) IBOutlet UILabel *headlineView;
@property(weak, nonatomic) IBOutlet UIImageView *mainImageView;
@property(weak, nonatomic) IBOutlet UILabel *captionView;

/// Populates the ad view with the custom native ad object.
- (void)populateWithCustomNativeAd:(GADNativeCustomTemplateAd *)customNativeAd;

@end

Swift

import UIKit
import GoogleMobileAds

/// Custom native ad view class with template ID 10063170.
class MySimpleNativeAdView: UIView {

  /// Weak references to this ad's asset views.
  @IBOutlet weak var headlineView: UILabel!
  @IBOutlet weak var mainImageView: UIImageView!
  @IBOutlet weak var captionView: UILabel!

  ...

  /// Populates the ad view with the custom native ad object.
  func populateWithCustomNativeAd(customNativeAd: GADNativeCustomTemplateAd) {
    ...
  }
}

MySimpleNativeAdView.m(节选)

Objective-C

...
- (void)populateWithCustomNativeAd:(GADNativeCustomTemplateAd *)customNativeAd {
  self.customNativeAd = customNativeAd;

  // Populate the custom native ad assets.
  self.headlineView.text = [customNativeAd stringForKey:@"Headline"];
  self.mainImageView.image = [customNativeAd imageForKey:@"MainImage"].image;
  self.captionView.text = [customNativeAd stringForKey:@"Caption"];
}
...

Swift

...
func populateWithCustomNativeAd(customNativeAd: GADNativeCustomTemplateAd) {
  self.customNativeAd = customNativeAd

  // Populate the custom native ad assets.
  headlineView.text = self.customNativeAd.stringForKey("Headline")
  mainImageView.image = self.customNativeAd.imageForKey("MainImage")?.image
  captionView.text = self.customNativeAd.stringForKey("Caption")
}
...

处理自定义原生广告格式的点击次数和展示次数

对于自定义原生广告格式,您的应用负责记录展示次数并向 SDK 报告点击事件。

记录展示次数

要记录自定义模板广告的展示次数,只需在相应 GADNativeCustomTemplateAd 上调用 recordImpression 方法:

Objective-C

[myCustomTemplateAd recordImpression];

Swift

myCustomTemplateAd.recordImpression()

如果您的应用偶然针对同一个广告多次调用该方法,则 SDK 会阻止系统针对单个请求重复记录展示次数。

报告点击次数

要向 SDK 报告在素材资源视图中发生了点击,请在相应 performClickOnAssetWithKey:customClickHandler: 上调用 GADNativeCustomTemplateAd 方法,并传入所点击素材资源的名称以及一个可选的自定义点击处理程序(详见下文)。例如,如果您的自定义模板中有一个名为“MainImage”的素材资源,并希望报告与该素材资源对应的视图上的点击,则代码如下所示:

Objective-C

[myCustomTemplateAd performClickOnAssetWithKey:@"MainImage"
                            customClickHandler:^{ /* an optional block */ }];

Swift

myCustomTemplateAd.performClickOnAssetWithKey(
    assetKey: "MainImage", customClickHandler: { /* an optional closure */ })

请注意,您不需要为与广告相关联的每个素材资源视图调用此方法。例如,如果您有另一个名为“Caption”的素材资源可供展示,但没有被用户点击或点按,则您的应用不需要为该视图调用 performClickOnAssetWithKey:customClickHandler:

响应自定义点击操作

当对自定义模板广告执行点击时,SDK 会有三种可能的响应,按以下顺序尝试:

  1. 调用 Objective-C 的 customClickHandler 块或 Swift 的 closure(如果已经传入)。
  2. 循环遍历广告深层链接网址,并打开第一个可找到匹配应用的网址。
  3. 打开浏览器并导航到广告的传统目标网址。

performClickOnAssetWithKey:customClickHandler: 方法接受 Objective-C 的一个块,并接受 Swift 的 closure 作为它的第二个参数。如果您传入块或 closure,SDK 将运行它,并且不会采取进一步操作。但是,如果您传入 nil 值,SDK 将会退回到广告中注册的深层链接和/或目标网址。

自定义点击处理程序可让您的应用自己决定响应点击的最佳操作,无论是更新界面、呈现其他视图控制器还是仅记录点击。以下是显示提醒的示例:

Objective-C

[self.customTemplateAd
    performClickOnAssetWithKey:@"MainImage"
            customClickHandler:^{
              [[[UIAlertView alloc] initWithTitle:@"Custom Click"
                                          message:@"You just clicked on the image!"
                                         delegate:self
                                cancelButtonTitle:@"OK"
                                otherButtonTitles:nil] show];
            }
];

Swift

customTemplateAd.performClickOnAssetWithKey(
    assetKey: "MainImage",
    customClickHandler: {
      let alertView = UIAlertView(title: "Custom Click",
          message: "You just clicked on the image!",
          delegate: self,
          cancelButtonTitle: "OK")
      alertView.alertViewStyle = .Default
      alertView.show()
    }
)

测试原生广告代码

直销广告

如果您想测试直销原生广告的呈现效果,可以使用此 DFP 广告单元 ID:

/6499/example/native

它已配置为投放示例应用安装广告和内容广告以及包含以下素材资源的自定义原生广告格式:

  • Headline(文字)
  • MainImage(图片)
  • Caption(文字)

自定义原生广告格式的模板 ID 为 10063170。请注意,目前发布商不应将 testDevices 属性用于原生广告请求。当前测试的最佳做法是,使用上述广告单元 ID,而不使用通过 testDevices 属性注册的设备。

原生补余广告

要测试原生补余广告的行为,请使用此 DFP 广告单元:

/6499/example/native-backfill

它将投放包含广告选择叠加层的示例应用安装广告和内容广告。

在实际投放前,请务必更新代码,确保在其中引用您的实际广告单元和模板 ID!

发送以下问题的反馈:

此网页
SDK for DFP Users on iOS
需要帮助?请访问我们的支持页面