原生广告

原生广告是通过平台原本就有的界面组件向用户呈现的广告素材资源。这种广告采用您已经在 Storyboard 中使用的那些类进行展示,能以和应用视觉设计相称的形式呈现,让用户有浑然一体的使用体验。

加载原生广告时,您的应用会收到一个包含其素材资源的广告对象,然后由应用(而不是 Google 移动广告 SDK)负责展示它们。

一般而言,要成功植入原生广告,就需要完成以下两步:使用 SDK 加载广告,然后在您的应用中展示广告内容。

本页介绍了如何使用 SDK 加载原生广告

前提条件

务必用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。

对于 iOS 上投放的原生广告,加载测试广告最简便的方法就是使用下面的测试专用广告单元 ID:

ca-app-pub-3940256099942544/3986624511

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

如需详细了解 Google 移动广告 SDK 的测试广告如何运作,请参阅测试广告

加载广告

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

初始化广告加载程序

您必须先初始化广告加载程序,然后才能加载广告。以下代码演示了如何初始化 GADAdLoader

Swift

adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
    // The UIViewController parameter is optional.
    rootViewController: rootViewController,
    adTypes: [ .native ],
    options: [ ... ad loader options objects ... ])
adLoader.delegate = self

Objective-C

self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511"
    // The UIViewController parameter is nullable.
    rootViewController:rootViewController
               adTypes:@[ GADAdLoaderAdTypeNative ]
               options:@[ ... ad loader options objects ... ]];
self.adLoader.delegate = self;

您需要指定一个广告单元 ID(可使用测试 ID)、要在 adTypes 数组中传递的常量(用于指明要请求哪些原生广告格式),此外还需要在 options 参数中指定要设置的任何选项。有关 options 参数的可取值列表,请参阅“设置原生广告选项”页面

adTypes 数组应包含此常量:

实现广告加载程序代理

广告加载程序代理需要实现专门用于您的广告类型的协议。对于原生广告,GADNativeAdLoaderDelegate 协议包含一条在原生广告加载后发送给代理的消息。

Swift

public func adLoader(_ adLoader: GADAdLoader,
            didReceive nativeAd: GADNativeAd)

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAd:(GADNativeAd *)nativeAd;

提出广告请求

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

Swift

adLoader.load(GADRequest())

Objective-C

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

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

加载多个广告(可选)

如需在单个请求中加载多个广告,请在初始化 GADAdLoader 时设置 GADMultipleAdsAdLoaderOptions 对象。

Swift

let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
multipleAdOptions.numberOfAds = 5;
adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
    // The UIViewController parameter is optional.
    rootViewController: self,
    adTypes: [ .native ],
    options: [ multipleAdOptions ])

Objective-C

GADMultipleAdsAdLoaderOptions *multipleAdsOptions =
    [[GADMultipleAdsAdLoaderOptions alloc] init];
multipleAdsOptions.numberOfAds = 5;
self.adLoader = [[GADAdLoader alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511"
    // The UIViewController parameter is nullable.
    rootViewController:rootViewController
               adTypes:@[ GADAdLoaderAdTypeNative ]
               options:@[ multipleAdsOptions ]];

每个请求的广告数量上限为 5 个,而且无法保证 SDK 返回的广告数量一定等于所请求的广告数量。

返回的 Google 广告将各不相同,但来自预订广告资源或第三方买方的广告不保证是唯一的。

如果您使用的是中介功能,请勿使用 GADMultipleAdsAdLoaderOptions 类,因为涉及多个原生广告的请求目前不适用于配置为使用中介功能的广告单元 ID。

确定加载完成时间

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

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

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

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

Swift

class ViewController: UIViewController, GADNativeAdLoaderDelegate {

  var adLoader: GADAdLoader!

  override func viewDidLoad() {
    super.viewDidLoad()

    let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
    multipleAdOptions.numberOfAds = 5;
    adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511",
        // The UIViewController parameter is optional.
        rootViewController: rootViewController,
        adTypes: [ .native ],
        options: [ multipleAdOptions ])

    adLoader.delegate = self
    adLoader.load(GADRequest())
  }

  func adLoader(_ adLoader: GADAdLoader,
       didReceive nativeAd: GADNativeAd) {
    // A native 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 () <GADNativeAdLoaderDelegate, 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:@"ca-app-pub-3940256099942544/3986624511"
      // The UIViewController parameter is nullable.
      rootViewController:rootViewController
                 adTypes:@[ GADAdLoaderAdTypeNative ]
                 options:@[ multipleAdsOptions ]];

  self.adLoader.delegate = self;
  [self.adLoader loadRequest:[GADRequest request]];
}

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveNativeAd:(GADNativeAd *)nativeAd {
  // A native 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 协议,该协议用于指定无法加载广告时应发送的消息。

Swift

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

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didFailToReceiveAdWithError:(NSError *)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 app to become inactive and
  // open a new app.
}

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 app to become inactive and
  // open a new app.
}

最佳做法

加载广告时,请遵循以下规则。

  • 在列表中使用原生广告的应用应预缓存广告列表。

  • 预缓存广告时,请清除缓存,并在一小时后重新加载。

  • 在上一项请求加载完毕(如 adLoaderDidFinishLoading: 所示)之前,请勿对 GADAdLoader 再次调用 loadRequest:

  • 仅缓存所需的原生广告。例如,在预缓存时,请仅缓存立即显示在屏幕上的广告。原生广告占用大量内存,如果缓存原生广告而不销毁它们,就会导致内存用量过多。

  • 在不再使用时销毁原生广告。

展示您的广告

加载广告后,剩下的工作就是将其展示给您的用户。请参阅我们的原生高级广告指南,了解具体方法。