原生高级广告

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

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

前提条件

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

应始终使用测试广告进行测试

首先要注意的是,在开发和测试应用时,应确保使用测试广告而不是已发布的广告。使用已发布的广告进行测试可能会导致您的帐号被暂停。

最简便的测试广告加载方法就是使用所有 iOS 原生高级广告的专用测试广告单元 ID:

ca-app-pub-3940256099942544/3986624511

该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。

有关移动广告 SDK 的测试广告工作原理的详细信息,请参阅测试广告

加载广告

有两种系统定义的原生广告格式:应用安装广告和内容广告。

应用安装广告由 GADNativeAppInstallAd 表示,内容广告由 GADNativeContentAd 表示。这些类的实例包含原生广告的素材资源。

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

初始化广告加载程序

在加载广告之前,您必须初始化广告加载程序。以下代码演示了如何初始化 GADAdLoader

Swift

adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
    rootViewController: self,
        adTypes: [ ... ad type constants ... ],
    options: [ ... ad loader options objects ... ])
adLoader.delegate = self

Objective-C

self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511"
    rootViewController:rootViewController
               adTypes:@[ ... ad type constants ... ]
               options:@[ ... ad loader options objects ... ]];
self.adLoader.delegate = self;

您需要一个广告单元 ID(可使用测试 ID),要在 adTypes 数组中传递以指定要请求的原生格式的常量,以及您希望在 options 参数中设置的任何选项。有关 options 参数的可能值列表,请参阅下面的设置原生广告选项部分。

adTypes 数组应包含以下一个或多个常量:

实现广告加载程序代理

广告加载程序代理需要实现特别针对您的广告类型的协议。对于原生广告:

  • GADNativeAppInstallAdLoaderDelegate 此协议包括一条在应用安装广告加载后发送给代理的消息:

    Swift

    public func adLoader(_ adLoader: GADAdLoader,
        didReceive nativeAppInstallAd: GADNativeAppInstallAd)
    

    Objective-C

    - (void)adLoader:(GADAdLoader *)adLoader
        didReceiveNativeAppInstallAd:(GADNativeAppInstallAd *)nativeAppInstallAd;
    
  • GADNativeContentAdLoaderDelegate 此协议会定义一条在内容广告加载后发送的消息:

    Swift

    public func adLoader(_ adLoader: GADAdLoader,
        didReceive nativeContentAd: GADNativeContentAd)
    

    Objective-C

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

请求广告

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

Swift

adLoader.load(GADRequest())

Objective-C

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

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

何时请求广告

展示原生广告的应用可以在实际展示之前随时请求这些广告。在许多情况下,建议采取这种做法。例如,如果应用要展示其中混合了原生广告的项目列表,则可以加载整个列表的原生广告,并且了解其中一些广告将仅在用户滚动视图之后展示,而有一些可能根本不会展示。

尽管预提取广告技术十分便利,但您务必不要太过长久地保留旧广告,而不进行展示。对任何原生广告对象来说,如果在保留一小时后仍没有获得展示,就应该予以舍弃,并替换为新请求提供的新广告。

确定加载完成时间

在应用调用 loadRequest: 后,可通过调用以下方法获取请求的结果:

如果一个请求中涉及单个广告,则系统会对上述方法之一进行一次调用。

如果一个请求中涉及多个广告,则系统会对上述方法进行至少一次回调,但回调次数不会超过请求的广告数量上限。

此外,GADAdLoaderDelegate 还会提供 adLoaderDidFinishLoading 回调。此代理方法指示广告加载程序已完成广告加载,且不会报告该请求的其他广告或错误。以下示例展示了如何在一次性加载多个原生广告时使用该方法。

Swift

class ViewController: UIViewController,  GADNativeAppInstallAdLoaderDelegate,
    GADNativeContentAdLoaderDelegate {

  var adLoader: GADAdLoader!

  override func viewDidLoad() {
    super.viewDidLoad()

    let multipleAdsOptions = GADMultipleAdsAdLoaderOptions()
    multipleAdsOptions.numberOfAds = 5

    adLoader = GADAdLoader(adUnitID: YOUR_AD_UNIT_ID, rootViewController: self,
        adTypes: [GADAdLoaderAdType.nativeContent,
                  GADAdLoaderAdType.nativeAppInstall],
        options: [multipleAdsOptions])
    adLoader.delegate = self
    adLoader.load(GADRequest())
  }
 
  func adLoader(_ adLoader: GADAdLoader,
                didReceive nativeAppInstallAd: GADNativeAppInstallAd) {
    // An app install ad has loaded, and can be displayed.
  }

  func adLoader(_ adLoader: GADAdLoader,
                didReceive nativeContentAd: GADNativeContentAd) {
      // A content ad has loaded, and can be displayed.
  }
 
  func adLoaderDidFinishLoading(_ adLoader: GADAdLoader) {
      // The adLoader has finished loading ads, and a new request can be sent.
  }

}

Objective-C

@interface ViewController () <GADNativeAppInstallAdLoaderDelegate,
    GADNativeContentAdLoaderDelegate, GADVideoControllerDelegate>{
 
@property(nonatomic, strong) GADAdLoader *adLoader;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  GADMultipleAdsAdLoaderOptions *multipleAdsOptions =
      [[GADMultipleAdsAdLoaderOptions alloc] init];
  multipleAdsOptions.numberOfAds = 5;

  self.adLoader = [[GADAdLoader alloc] initWithAdUnitID:YOUR_AD_UNIT_ID
          rootViewController:self
                     adTypes:@[kGADAdLoaderAdTypeNativeContent,
                               kGADAdLoaderAdTypeNtiveAppInstall]
                     options:@[multipleAdsOptions]];
  self.adLoader.delegate = self;
  [self.adLoader loadRequest:[GADRequest request]];
}

 
- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAppInstallAd:(GADNativeAppInstallAd *)nativeAppInstallAd {
   // An app install ad has loaded, and can be displayed.
}

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeContentAd:(GADNativeContentAd *)nativeContentAd {
   // A content ad has loaded, and can be displayed.
}
 
- (void)adLoaderDidFinishLoading:(GADAdLoader *) adLoader {
  // The adLoader has finished loading ads, and a new request can be sent.
}

@end

处理失败的请求

上述协议扩展了 GADAdLoaderDelegate 协议,以便定义无法加载广告时应发送的消息。您可以使用 GADRequestError 对象来确定错误的原因。

Swift

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

Objective-C

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

接收有关原生广告事件的通知

要接收与原生广告互动相关的事件的通知,请设置原生广告的代理属性:

Swift

nativeAd.delegate = self

Objective-C

nativeAd.delegate = self;

然后,实现 GADNativeAdDelegate 以接收以下代理调用:

Swift

func nativeAdDidRecordImpression(_ nativeAd: GADNativeAd) {
  // The native ad was shown.
}

func nativeAdDidRecordClick(_ nativeAd: GADNativeAd) {
  // The native ad was clicked on.
}

func nativeAdWillPresentScreen(_ nativeAd: GADNativeAd) {
  // The native ad will present a full screen view.
}

func nativeAdWillDismissScreen(_ nativeAd: GADNativeAd) {
  // The native ad will dismiss a full screen view.
}

func nativeAdDidDismissScreen(_ nativeAd: GADNativeAd) {
  // The native ad did dismiss a full screen view.
}

func nativeAdWillLeaveApplication(_ nativeAd: GADNativeAd) {
  // The native ad will cause the application to become inactive and
  // open a new application.
}

Objective-C

- (void)nativeAdDidRecordImpression:(GADNativeAd *)nativeAd {
  // The native ad was shown.
}

- (void)nativeAdDidRecordClick:(GADNativeAd *)nativeAd {
  // The native ad was clicked on.
}

- (void)nativeAdWillPresentScreen:(GADNativeAd *)nativeAd {
  // The native ad will present a full screen view.
}

- (void)nativeAdWillDismissScreen:(GADNativeAd *)nativeAd {
  // The native ad will dismiss a full screen view.
}

- (void)nativeAdDidDismissScreen:(GADNativeAd *)nativeAd {
  // The native ad did dismiss a full screen view.
}

- (void)nativeAdWillLeaveApplication:(GADNativeAd *)nativeAd {
  // The native ad will cause the application to become inactive and
  // open a new application.
}

原生广告选项

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

Swift

adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
    rootViewController: self,
    adTypes: [ ... ad type constants ... ],
    options: [ ... ad loader options objects ... ])

Objective-C

self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511"
    rootViewController:rootViewController
               adTypes:@[ ... ad type constants ... ]
               options:@[ ... ad loader options objects ... ]];

此可选数组包含 GADAdLoaderOptions 子类 (GADNativeAdImageAdLoaderOptions) 的一个或多个实例;这些实例是一些对象,可供应用用于指示自身在原生广告加载方式和行为方式上的偏好。

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

GADNativeAdImageAdLoaderOptions 具有以下属性:

disableImageLoading
通过包含 imageimageURL 属性的 GADNativeAdImage 实例返回原生广告的图片素材资源。如果 disableImageLoading 设置为 false(这是默认值,在 Objective-C 中为 NO),则 SDK 会自动获取图片素材资源,并为您填充 imageimageURL 属性。不过,如果设置为 true(在 Objective-C 中为 YES),SDK 将只填充 imageURL,从而允许您自行决定是否下载实际图片。
preferredImageOrientation

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

  • GADNativeAdImageAdLoaderOptionsOrientationAny
  • GADNativeAdImageAdLoaderOptionsOrientationLandscape
  • GADNativeAdImageAdLoaderOptionsOrientationPortrait

    如果使用 preferredImageOrientation 来指定横向或纵向图片方向的首选项,SDK 会先在图片素材资源数组中放置与该方向匹配的图片,然后将不匹配的图片放在它们后面。由于某些广告只能有一个方向,发布商应确保其应用可同时处理横向和纵向图片。

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

shouldRequestMultipleImages

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

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

GADNativeAdViewOptions

GADNativeAdViewAdOptions 对象用于指示原生广告视图应使用的广告呈现偏好。这些对象具有一个 preferredAdChoicesPosition 属性,您可以使用该属性指定“广告选择”图标应放置的位置。该图标可以显示在广告的任一角,默认为 GADAdChoicesPositionTopRightCorner。此属性的可能值包括:

  • GADAdChoicesPositionTopRightCorner
  • GADAdChoicesPositionTopLeftCorner
  • GADAdChoicesPositionBottomRightCorner
  • GADAdChoicesPositionBottomLeftCorner

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

Swift

let adViewOptions = GADNativeAdViewAdOptions()
adViewOptions.preferredAdChoicesPosition = .topLeftCorner
adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
    rootViewController: self,
    adTypes: [ ... ad type constants ... ],
    options: [ ... ad loader options objects ... ])

Objective-C

GADNativeAdViewAdOptions *adViewOptions = [[GADNativeAdViewAdOptions alloc] init];
adViewOptions.preferredAdChoicesPosition = GADAdChoicesPositionTopLeftCorner;
self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511"
    rootViewController:self
               adTypes:@[ ... ad type constants ...  ]
               options:@[ ... ad loader options objects ... ]];

GADVideoOptions

GADVideoOptions 对象用于指示应如何展示原生视频广告素材资源。这些属性提供单一属性:startMuted

此布尔值指示视频素材资源是否应在静音状态下开始播放。其默认值为 true

GADMultipleAdsAdLoaderOptions

借助 GADMultipleAdsAdLoaderOptions 对象,发布商可以指示广告加载程序通过一次请求加载多个广告。以这种方式加载的广告可确保唯一性。GADMultipleAdsAdLoaderOptions 具有一个属性 numberOfAds,该属性表示的是广告加载程序应为请求返回的广告数量。默认值为 1 个,上限为 5 个(即使应用请求了更多广告,也最多只返回 5 个)。虽然无法保证实际返回的广告数量,但会介于零和 numberOfAds 之间。

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

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

广告视图类

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

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

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

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

广告选择叠加层

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

广告标示

在展示程序化原生广告时,您必须展示广告标示,以指明该视图是广告。

代码示例

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

布置 UIViews

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

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

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

此外,您还需要为 GADMediaView 设置自定义类,用于显示广告视频或图片。

将输出口与视图相关联

在视图设置完毕并已给布局分配适当的广告视图类后,请将广告视图的素材资源输出口与创建的 UIViews 关联起来。以下是广告视图的素材资源输出口与为应用安装广告创建的 UIViews 的关联方法: 以下是将广告视图的素材资源输出口与为内容广告创建的 UIViews 相关联的方法: 在输出口面板中,GADNativeContentAdView 中的输出口已与 Interface Builder 中布置的 UIViews 相关联。这使 SDK 可以了解哪个 UIView 显示哪个素材资源。同时请务必注意,这些输出口表示广告中可点击的视图。

展示广告

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

Swift

// Mark: - GADNativeAppInstallAdLoaderDelegate

func adLoader(_ adLoader: GADAdLoader,
    didReceive nativeAppInstallAd: GADNativeAppInstallAd) {
  // Create and place the ad in the view hierarchy.
  let appInstallAdView = Bundle.main.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 as well as populate the media view.
  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.callToActionView as! UIButton).setTitle(
      nativeAppInstallAd.callToAction, for: 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?.isHidden = false
  } else {
    starRatingView?.isHidden = true
  }

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

  let priceView = appInstallAdView.priceView
  if let price = nativeAppInstallAd.price {
    (priceView as! UILabel).text = price
    priceView?.isHidden = false
  } else {
    priceView?.isHidden = 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).isUserInteractionEnabled = false
}

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 as well as populate the media view.
  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;
  [((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: - GADNativeContentAdLoaderDelegate

func adLoader(_ adLoader: GADAdLoader,
    didReceive nativeContentAd: GADNativeContentAd) {
  // Create and place the ad in the view hierarchy.
  let contentAdView = Bundle.main.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.advertiserView as! UILabel).text = nativeContentAd.advertiser
  (contentAdView.callToActionView as! UIButton).setTitle(
      nativeContentAd.callToAction, for: 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?.isHidden = false
  } else {
    logoView?.isHidden = 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).isUserInteractionEnabled = 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;
  ((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 userInteractionEnabledset to YES by default, views of
  // this type must explicitly set userInteractionEnabled to NO.
  contentAdView.callToActionView.userInteractionEnabled = NO;
}

GADMediaView

图片和视频素材资源通过 GADMediaView 向用户展示。这是可在 xib 文件中定义或动态构建的 UIView。像所有其他素材资源视图一样,应该将其放在 GADNativeAdView 的视图层次结构中。

但与其他素材资源视图不同的是,应用不需要用其素材资源手动填充 GADMediaView。设置nativeAppInstallAdnativeContentAd属性后,SDK 会自动处理此填充事宜。

  • 如果有视频素材资源可用,则会对其进行缓冲处理,并开始在 GADMediaView 内播放。
  • 如果广告不包含视频素材资源,则会改为下载第一个图片素材资源,并将其放置在 GADMediaView 内。

    以下是原生高级广告的代码段示例:(Swift | Objective-C), 该示例展示了如何通过将原生广告与原生广告视图相关联,用原生广告素材资源填充 GADMediaView

Swift

nativeAdView.nativeAd = nativeAd

Objective-C

nativeAdView.nativeAd = nativeAd;

确保在原生广告视图的 Interface Builder 文件中,您已将视图自定义类设置为 GADMediaView,并已将其连接到 mediaView 输出口。

原生视频广告

除了图片、文字和数字外,有些原生广告会包含视频素材资源。并不是每个广告会都包含视频素材资源;如果广告中包含此类素材资源,也不需要相关应用播放这些视频。

GADVideoController

GADVideoController 类用于获取与视频素材资源相关的信息。 GADNativeAppInstallAdGADNativeContentAd 都提供videoController 属性,该属性可为每个广告显示 GADVideoController

Swift

let vc1 = myAppInstallAd.videoController
let vc2 = myContentAd.videoController

Objective-C

GADVideoController *vc1 = myAppInstallAd.videoController
GADVideoController *vc2 = myContentAd.videoController

即使广告不包含视频素材资源,此属性也始终不会是 nil

GADVideoController 提供以下查询视频状态的方法:

  • hasVideoContent - 如果广告包含视频素材资源,则为 True,否则为 false。
  • aspectRatio - 视频的宽高比(宽度/高度)或 0(零)(如果没有视频素材资源)。

此外,应用还可以为 GADVideoController 设置 GADVideoControllerDelegate,以便在视频素材资源生命周期内发生事件时收到通知。GADVideoControllerDelegate 提供一条可选消息 videoControllerDidEndVideoPlayback,该消息会在视频播放结束时发送出去。

以下是 GADVideoControllerDelegate 的实际应用示例:

Swift

class ViewController: UIViewController, GADNativeAppInstallAdLoaderDelegate,
    GADVideoControllerDelegate {

  func adLoader(_ adLoader: GADAdLoader, didReceive nativeAppInstallAd:
                GADNativeAppInstallAd) {
    ...
    nativeAppInstallAd.videController.delegate = self
    ...
  }

  ...
  func videoControllerDidEndVideoPlayback(_ videoController: Any!) {
    // Here apps can take action knowing video playback is finished.
    // This is handy for things like unmuting audio, and so on.
  }
}

Objective-C

@interface ViewController () <GADNativeAppInstallAdLoaderDelegate,
        GADVideoControllerDelegate>

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAppInstallAd:(GADNativeAppInstallAd) *)nativeAppInstallAd {
  ...
  nativeAppInstallAd.videoController.delegate = self;
  ...
}

...

- (void)videoControllerDidEndVideoPlayback:(GADVideoController *)videoController {
  // Here apps can take action knowing video playback is finished.
  // This is handy for things like unmuting audio, and so on.
}

@end

其他资源

示例

Codelab

后续步骤

发送以下问题的反馈:

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