横幅广告

入门指南中,您了解了如何部署 SDK 和展示测试横幅广告。本指南将详细介绍可以对横幅广告进行的自定义设置。

要了解这些横幅广告自定义的实现,请下载 Objective-C 或 Swift 语言的 iOS API Demo 应用。

下载 API Demo

Google 移动广告支持以下横幅广告尺寸:

尺寸(宽 x 高) 说明 适用设备 AdSize 常量
320x50 标准横幅广告 手机和平板电脑 kGADAdSizeBanner
320x100 大型横幅广告 手机和平板电脑 kGADAdSizeLargeBanner
300x250 IAB 中矩形 手机和平板电脑 kGADAdSizeMediumRectangle
468x60 IAB 全尺寸横幅广告 平板电脑 kGADAdSizeFullBanner
728x90 IAB 页首横幅广告 平板电脑 kGADAdSizeLeaderboard
屏幕宽度 x 32|50|90 智能横幅广告 手机和平板电脑 kGADAdSizeSmartBannerPortrait
kGADAdSizeSmartBannerLandscape

智能横幅广告

智能横幅广告是一种广告单元,可在任意尺寸的各种设备上展示与屏幕等宽的横幅广告,无论设备屏幕是横向还是纵向都没问题。智能横幅广告可“智能”地检测手机处于当前屏幕方向时的宽度,并据此设置尺寸合适的广告视图,从而解决不同设备间屏幕尺寸不同的问题。

智能横幅广告可实现三种广告高度(以“与密度无关的像素 [dp]”为单位):

  • 32:设备屏幕高度 <= 400
  • 50400 < 设备屏幕高度 <= 720
  • 90:设备屏幕高度 > 720

对于手机等某些设备来说,设备的高度会因屏幕方向而异。通常情况下,当手机屏幕为纵向时,智能横幅广告尺寸为“完整宽度 x 50dp”;当手机屏幕为横向时,广告尺寸为“完整宽度 x 32dp”;在平板电脑上,不论屏幕方向为纵向还是横向,广告尺寸均为“完整宽度 x 90dp”。

当图片广告不足以占据所分配的整个空间时,我们会将图片居中放置,然后填充两侧剩余的空间。

要使用智能横幅广告,您需要使用常量 kGADAdSizeSmartBannerPortraitkGADAdSizeSmartBannerLandscape,例如:

Objective-C

// Use kGADAdSizeSmartBannerLandscape if your app is running in landscape.
DFPBannerView *bannerView = [[DFPBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];

Swift

// Use kGADAdSizeSmartBannerLandscape if your app is running in landscape.
let bannerView = DFPBannerView(adSize: kGADAdSizeSmartBannerPortrait)

自定义广告尺寸

除了标准 AdMob 广告单元之外,DFP 广告管理系统(以下简称 DFP)允许您在应用中投放任意尺寸的广告单元。为广告请求设定的广告尺寸(宽度、高度)应与应用上所展示广告视图 (DFPBannerView) 的尺寸相匹配。

Objective-C

// Define custom GADAdSize of 250x250 for DFPBannerView
GADAdSize customAdSize = GADAdSizeFromCGSize(CGSizeMake(250, 250));
self.bannerView = [[DFPBannerView alloc] initWithAdSize:customAdSize];

Swift

// Define custom GADAdSize of 250x250 for DFPBannerView.
let customAdSize = GADAdSizeFromCGSize(CGSize(width: 250, height: 250))
bannerView = DFPBannerView(adSize: customAdSize)

有关 iOS API Demo 应用中自定义广告尺寸的实现方式,请参阅 DFP 多广告尺寸示例。

Objective-C Swift

多广告尺寸

DFP 允许您指定可能适合投放到 DFPBannerView 的多个广告尺寸。使用此功能需要三个步骤:

  1. 在 DFP 界面中,创建一个订单项,定位关联多个不同尺寸广告素材的同一广告单元。

  2. 在您应用中的 DFPBannerView 上设置 validAdSizes 属性:

    Objective-C

    // Define an optional array of GADAdSize to specify all valid sizes that are appropriate
    // for this slot. Never create your own GADAdSize directly. Use one of the
    // predefined standard ad sizes (such as kGADAdSizeBanner), or create one using
    // the GADAdSizeFromCGSize method.
    //
    // Note: Ensure that the allocated DFPBannerView is defined with an ad size. Also note
    // that all desired sizes should be included in the validAdSizes array.
    self.bannerView.validAdSizes = @[
        NSValueFromGADAdSize(kGADAdSizeBanner),
        NSValueFromGADAdSize(kGADAdSizeMediumRectangle),
        NSValueFromGADAdSize(GADAdSizeFromCGSize(CGSizeMake(120, 20)))
    ];
    

    Swift

    // Define an optional array of GADAdSize to specify all valid sizes that are appropriate
    // for this slot. Never create your own GADAdSize directly. Use one of the
    // predefined standard ad sizes (such as kGADAdSizeBanner), or create one using
    // the GADAdSizeFromCGSize method.
    //
    // Note: Ensure that the allocated DFPBannerView is defined with an ad size. Also note
    // that all desired sizes should be included in the validAdSizes array.
    bannerView.validAdSizes = [NSValueFromGADAdSize(kGADAdSizeBanner),
        NSValueFromGADAdSize(kGADAdSizeMediumRectangle),
        NSValueFromGADAdSize(GADAdSizeFromCGSize(CGSize(width: 120, height: 20)))]
    

  3. 实现 GADAdSizeDelegate 方法来检测广告尺寸更改。

    Objective-C

    - (void)adView:(DFPBannerView *)view willChangeAdSizeTo:(GADAdSize)size;
    

    Swift

    public func adView(bannerView: DFPBannerView!, willChangeAdSizeTo size: GADAdSize)
    

    发出广告请求前,请务必设置委托:

    Objective-C

    self.bannerView.adSizeDelegate = self;

    Swift

    bannerView.adSizeDelegate = self

有关 iOS API Demo 应用中自定义广告尺寸的实现方式,请参阅 DFP 多广告尺寸示例。

Objective-C Swift

手动展示次数计数

如果您针对应在何时记录展示次数设置了特殊条件,则可以手动向 DFP 发送展示 ping。为此,请在加载广告之前首先为手动展示启用 DFPBannerView

Objective-C

self.bannerView.enableManualImpressions = YES;

Swift

bannerView.enableManualImpressions = true

当您确定广告已成功返回并展示在屏幕上时,您可以手动触发一次展示:

Objective-C

[self.bannerView recordImpression];

Swift

bannerView.recordImpression()

应用事件

应用事件可供您制作可将消息发送至应用代码的广告。然后应用可以基于这些消息进行操作。

您可以使用 GADAppEventDelegate 来监听 DFP 特定应用事件。这些事件可能会发生在广告生命周期内的任何时间,甚至在调用 GADBannerViewDelegateadViewDidReceiveAd: 之前。

Objective-C

// Implement your app event within these methods. The delegate will be
// notified when the SDK receives an app event message from the ad.

@optional
// Called when the banner receives an app event.
- (void)adView:(DFPBannerView *)banner
    didReceiveAppEvent:(NSString *)name
              withInfo:(NSString *)info;
// Called when the interstitial receives an app event.
- (void)interstitial:(DFPInterstitial *)interstitial
    didReceiveAppEvent:(NSString *)name
              withInfo:(NSString *)info;

Swift

// Implement your app event within these methods. The delegate will be
// notified when the SDK receives an app event message from the ad.

// Called when the banner receives an app event.
optional public func adView(banner: GADBannerView!,
    didReceiveAppEvent name: String!, withInfo info: String!)

// Called when the interstitial receives an app event.
optional public func interstitial(interstitial: GADInterstitial!,
    didReceiveAppEvent name: String!, withInfo info: String!)

您可以在视图控制器中实现应用事件方法:

Objective-C

@import GoogleMobileAds;

@interface ViewController : UIViewController  {
}

@end

Swift

import GoogleMobileAds

class ViewController: UIViewController, GADAppEventDelegate {
}

在请求广告前,请务必先使用 appEventDelegate 属性设置委托:

Objective-C

self.bannerView.appEventDelegate = self;

Swift

bannerView.appEventDelegate = self

下面的示例显示了如何根据带颜色名称的应用事件更改应用的背景颜色:

Objective-C

- (void)adView:(DFPBannerView *)banner
    didReceiveAppEvent:(NSString *)name
              withInfo:(NSString *)info {
  if ([name isEqual:@"color"]) {
    if ([info isEqual:@"green"]) {
      // Set background color to green.
      self.view.backgroundColor = [UIColor greenColor];
    } else if ([info isEqual:@"blue"]) {
      // Set background color to blue.
      self.view.backgroundColor = [UIColor blueColor];
    } else
      // Set background color to black.
      self.view.backgroundColor = [UIColor blackColor];
    }
  }
}

Swift

func adView(banner: GADBannerView!, didReceiveAppEvent name: String!,
    withInfo info: String!) {
  if name == "color" {
    switch info {
    case "green":
      // Set background color to green.
      view.backgroundColor = UIColor.greenColor()
    case "blue":
      // Set background color to blue.
      view.backgroundColor = UIColor.blueColor()
    default:
      // Set background color to black.
      view.backgroundColor = UIColor.blackColor()
    }
  }
}

另外,下面是向 appEventDelegate 发送颜色应用事件消息的相应广告素材:

<html>
<head>
  <script src="//media.admob.com/api/v1/google_mobile_app_ads.js"></script>
  <script>
    // Send a color=green event when ad loads.
    admob.events.dispatchAppEvent("color", "green");

    handleClick = function() {
      // Send a color=blue event when ad is clicked.
      admob.events.dispatchAppEvent("color", "blue");
    };
  </script>
  <style>
    #ad {
      width: 320px;
      height: 50px;
      top: 0px;
      left: 0px;
      font-size: 24pt;
      font-weight: bold;
      position: absolute;
      background: black;
      color: white;
      text-align: center;
    }
  </style>
</head>
<body>
  <div id="ad" onClick="handleClick()">Carpe diem!</div>
</body>
</html>

有关 iOS API Demo 应用中应用事件的实现方式,请参阅 DFP 应用事件示例。

Objective-C Swift

广告生命周期事件回调

您可以视需要实现全部或部分 GADBannerViewDelegate,以跟踪请求失败或“点击”等广告生命周期事件。

Objective-C

@protocol GADBannerViewDelegate 
@optional
- (void)adViewDidReceiveAd:(DFPBannerView *)bannerView;
- (void)adView:(DFPBannerView *)bannerView
    didFailToReceiveAdWithError:(GADRequestError *)error;
- (void)adViewWillPresentScreen:(DFPBannerView *)bannerView;
- (void)adViewDidDismissScreen:(DFPBannerView *)bannerView;
- (void)adViewWillDismissScreen:(DFPBannerView *)bannerView;
- (void)adViewWillLeaveApplication:(DFPBannerView *)bannerView;
@end

Swift

public protocol GADBannerViewDelegate: NSObjectProtocol {
  optional public func adViewDidReceiveAd(bannerView: GADBannerView!)
  optional public func adView(bannerView: GADBannerView!,
      didFailToReceiveAdWithError error: GADRequestError!)
  optional public func adViewWillPresentScreen(bannerView: GADBannerView!)
  optional public func adViewWillDismissScreen(bannerView: GADBannerView!)
  optional public func adViewDidDismissScreen(bannerView: GADBannerView!)
  optional public func adViewWillLeaveApplication(bannerView: GADBannerView!)
}

这些方法既可以在视图控制器等独立的对象中实现:

Objective-C

@import GoogleMobileAds;

@interface ViewController : UIViewController  {
}

@end

Swift

import GoogleMobileAds

class ViewController: UIViewController, GADBannerViewDelegate {
}

也可以作为 DFPBannerView 子类的一部分来实现:

Objective-C

@import GoogleMobileAds;

@interface MyBannerView : DFPBannerView  {
}

@end

Swift

import GoogleMobileAds

class MyBannerView: DFPBannerView, GADBannerViewDelegate {
}

发出广告请求前,请务必设置委托:

Objective-C

self.bannerView.delegate = self;

Swift

bannerView.delegate = self

adViewDidReceiveAd:

在 loadRequest: 成功时发送。如果发送者之前一直隐藏,这是将其添加到视图层级结构的好机会,例如:

Objective-C

- (void)adViewDidReceiveAd:(DFPBannerView *)bannerView {
  bannerView.hidden = NO;
}

Swift

func adViewDidReceiveAd(bannerView: DFPBannerView!) {
  bannerView.hidden = false
}

adView:didFailToReceiveAdWithError:

loadRequest: 失败时发送,常见失败原因:网络故障、应用配置错误或广告资源不足。您可以记录这些事件,以便进行调试:

Objective-C

- (void)adView:(DFPBannerView *)adView
    didFailToReceiveAdWithError:(GADRequestError *)error {
  NSLog(@"adView:didFailToReceiveAdWithError: %@", error.localizedDescription);
}

Swift

func adView(bannerView: DFPBannerView!,
    didFailToReceiveAdWithError error: GADRequestError!) {
  print("adView:didFailToReceiveAdWithError: \(error.localizedDescription)")
}

adViewWillPresentScreen:

在系统响应用户触摸发送者的操作而即将向其展示全屏广告界面时发送。与使用 UIApplicationDidEnterBackgroundNotification 时类似,此时应该暂停所有动画、计时器或其他可能会与用户互动的活动,并保存应用状态。通常,用户会在浏览后直接关闭全屏广告,这样会生成 adViewDidDismissScreen: 并将控制权交还给您的应用。如果横幅广告的操作是 Click-to-App-Store 或 Click-to-iTunes,或者用户在广告内按 Home 键,则您的应用会转到后台运行,并且可能终止运行。

如果使用 iOS 4.0 及以上版本,出现这些情况时,系统接着会相继调用根视图控制器的 applicationWillResignActive:adViewWillLeaveApplication: 这两个方法。

adViewDidDismissScreen:

当用户已退出发送者的全屏界面时发送。

adViewWillDismissScreen:

在用户关闭发送者的全屏界面前发送,用以恢复您的应用和根视图控制器。这时应该重新启动 adViewWillPresentScreen: 执行期间暂停的任何前台活动。

adViewWillLeaveApplication:

在应用因为用户触摸 Click-to-App-Store 或 Click-to-iTunes 横幅广告而转至后台或终止运行前发送。在此之前,先会有 applicationDidEnterBackground: 等常规 UIApplicationDelegate 通知显示。

请勿在 applicationWillEnterForeground: 中请求广告,因为系统会忽略这样的请求。请改为在 applicationDidBecomeActive: 中请求。

Objective-C 委托不会保留,可能会在委托对象最终获得释放之前采用异步方式发送出去。

有关 iOS API Demo 应用中广告生命周期事件回调的实现方式,请参阅广告委托示例。

Objective-C Swift

后续操作

发送以下问题的反馈:

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