原生广告是通过平台原本就有的界面组件向用户呈现的广告素材资源。这种广告采用您已经在 Storyboard 中使用的那些类进行展示,能以和应用视觉设计相称的形式呈现,让用户有浑然一体的使用体验。加载原生广告时,您的应用会收到一个包含其素材资源的广告对象,然后由应用(而不是 SDK)负责展示它们。这与其他广告格式不同,采用其他广告格式时您无法自行调整广告的外观。
本指南介绍了如何使用 Google 移动广告 SDK 在 iOS 应用中植入原生广告,以及在这一过程中需要注意的一些重要事项。
总的来说,要想成功植入原生广告,需要完成两部分工作:一是通过 SDK 加载广告,二是在您的应用中展示广告内容。本页将介绍如何使用 SDK 加载广告。
如果您已成功加载原生广告,只需知道其展示方式,则可以直接跳转到我们的原生广告模板或原生高级广告指南。
前提条件
- 导入 Google 移动广告 SDK(可以只导入其自身,也可以将其作为 Firebase 的一部分加以导入)。
务必用测试广告进行测试
开始之前,首先要注意的是,在开发和测试应用时,应确保使用测试广告而不是实际投放的广告。使用实际投放的广告进行测试可能会导致您的帐号被暂停。
对于在 iOS 上投放的所有原生高级广告,加载测试广告最简便的方法就是使用下面的测试专用广告单元 ID:
ca-app-pub-3940256099942544/3986624511
该测试广告单元 ID 已经过专门配置,可确保每个请求返回的都是测试广告。您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只是一定要在发布应用前用您自己的广告单元 ID 替换该测试广告单元 ID。
如需详细了解移动广告 SDK 的测试广告如何运作,请参阅测试广告。
加载广告
原生广告通过 GADAdLoader
对象加载,这些对象根据 GADAdLoaderDelegate
协议向它们的代理发送消息。
初始化广告加载程序
您必须先初始化广告加载程序,然后才能加载广告。以下代码演示了如何初始化 GADAdLoader
:
Swift
adLoader = GADAdLoader(adUnitID: "ca-app-pub-3940256099942544/3986624511", rootViewController: self, adTypes: [ .native ], options: [ ... ad loader options objects ... ]) adLoader.delegate = self
Objective-C
self.adLoader = [[GADAdLoader alloc] initWithAdUnitID:@"ca-app-pub-3940256099942544/3986624511" 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
对象。您可以使用请求对象来添加定位信息,这与其他广告类型一样。
何时请求广告
展示原生广告的应用完全可以在实际展示广告之前先行请求这些广告。在许多情况下,推荐采取这种做法。例如,如果某款应用展示一个商品清单,其中会夹杂一些原生广告,那么该应用就可以加载整个清单中的原生广告,因为它知道一些广告仅在用户滚动浏览视图后才会展示,还有一些可能根本不会展示。
尽管预先提取广告是很好的做法,但切勿一直保留旧广告而不展示它们。对任何原生广告对象来说,如果在保留一小时后仍没有获得展示,就应该予以舍弃,并替换为来自新请求的新广告。
确定加载完成时间
在应用调用 loadRequest:
后,可通过调用以下方法获取请求的结果:
GADAdLoaderDelegate
中的adLoader:didFailToReceiveAdWithError:
GADNativeAdLoaderDelegate
中的adLoader:didReceiveNativeAd:
如果一个请求中只涉及单个广告,则系统会对上述方法之一进行一次调用。
如果一个请求中涉及多个广告,则系统会对上述方法进行至少一次回调,但回调次数不会超过请求的广告数量上限。
此外,GADAdLoaderDelegate
还会提供 adLoaderDidFinishLoading
回调。此代理方法表示广告加载程序已完成广告加载,针对该请求不会报告任何其他广告或错误。下例展示了如何在一次性加载多个原生广告时使用该方法:
Swift
class ViewController: UIViewController, GADNativeAdLoaderDelegate { var adLoader: GADAdLoader! override func viewDidLoad() { super.viewDidLoad() let multipleAdsOptions = GADMultipleAdsAdLoaderOptions() multipleAdsOptions.numberOfAds = 5 adLoader = GADAdLoader(adUnitID: YOUR_AD_UNIT_ID, rootViewController: self, adTypes: [.native], options: [multipleAdsOptions]) 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:YOUR_AD_UNIT_ID rootViewController:self 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 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. }
展示您的广告
加载广告后,剩下的工作就是将其展示给您的用户。请参阅我们的原生高级广告指南,了解具体方法。