插页式广告

插页式广告属于全屏广告,会覆盖宿主应用的整个界面,通常展示在应用流程的自然过渡点,例如,游戏关卡间的暂停时段。当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。案例研究

本指南介绍了如何将插页式广告植入到 Unity 应用中。

前提条件

完成入门指南。您的 Unity 应用应该已经导入了 Google 移动广告 Unity 插件。

制作插页式广告

要展示插页式广告,首先要在附加到 GameObject 的脚本中创建 InterstitialAd 对象。

using GoogleMobileAds.Api;
...

private InterstitialAd interstitial;

private void RequestInterstitial()
{
    #if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    #elif UNITY_IPHONE
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
    #else
        string adUnitId = "unexpected_platform";
    #endif

    // Initialize an InterstitialAd.
    this.interstitial = new InterstitialAd(adUnitId);
}

InterstitialAd 的构造函数包含以下参数:

  • adUnitId - AdMob 广告单元 ID,InterstitialAd 应通过该 ID 加载广告。

请务必注意,您需要根据平台选择使用不同的广告单元。在 iOS 设备上发出广告请求时,您需要使用 iOS 广告单元,而在 Android 设备上发出请求时,您需要使用 Android 广告单元。

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

上述示例代码包含一个广告单元 ID,您可以随意使用该 ID 请求广告。该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告(而不是实际投放的广告),从而能够安全地使用。

但是,如果您在 AdMob 界面中注册了应用,并创建了您自己的广告单元 ID 以便在该应用中使用,那么您需要在开发期间明确地将您的设备配置为测试设备。这极其重要。使用真正的广告进行测试(即使您从未点按它们)会违反 AdMob 政策,可能会导致您的帐号被暂停。要了解如何确保在开发期间始终获得测试广告,请参阅测试广告

加载广告

实例化 InterstitialAd 之后,下一步是加载广告。此步骤可使用 InterstitialAd 类中的 loadAd() 方法完成。这需要 AdRequest 参数,该参数包含有关单个广告请求的运行时信息(如定位信息)。

以下示例展示了如何加载广告:

using GoogleMobileAds.Api;
...
private InterstitialAd interstitial;

private void RequestInterstitial()
{
    #if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    #elif UNITY_IPHONE
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
    #else
        string adUnitId = "unexpected_platform";
    #endif

    // Initialize an InterstitialAd.
    this.interstitial = new InterstitialAd(adUnitId);
    // Create an empty ad request.
    AdRequest request = new AdRequest.Builder().Build();
    // Load the interstitial with the request.
    this.interstitial.LoadAd(request);
}

展示广告

插页式广告应在应用流程的自然停顿期间进行展示,例如游戏的不同关卡之间或用户完成一项任务之后,都是非常不错的展示时机。要展示插页式广告,请使用 isLoaded() 方法验证广告是否已完成加载,然后调用 show()

上一个代码示例中的插页式广告可以在游戏结束时展示,如下所示。

private void GameOver()
{
  if (this.interstitial.IsLoaded()) {
    this.interstitial.Show();
  }
}

广告事件

要进一步自定义您广告的行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以为相应的 EventHandler 注册代理来监听这些事件,如下所示。

using GoogleMobileAds.Api;
...
private InterstitialAd interstitial;

private void RequestInterstitial()
{
    #if UNITY_ANDROID
        string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    #elif UNITY_IPHONE
        string adUnitId = "ca-app-pub-3940256099942544/4411468910";
    #else
        string adUnitId = "unexpected_platform";
    #endif

     // Initialize an InterstitialAd.
    this.interstitial = new InterstitialAd(adUnitId);

    // Called when an ad request has successfully loaded.
    this.interstitial.OnAdLoaded += HandleOnAdLoaded;
    // Called when an ad request failed to load.
    this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
    // Called when an ad is shown.
    this.interstitial.OnAdOpening += HandleOnAdOpened;
    // Called when the ad is closed.
    this.interstitial.OnAdClosed += HandleOnAdClosed;
    // Called when the ad click caused the user to leave the application.
    this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;

    // Create an empty ad request.
    AdRequest request = new AdRequest.Builder().Build();
    // Load the interstitial with the request.
    this.interstitial.LoadAd(request);
}

public void HandleOnAdLoaded(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdLoaded event received");
}

public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    MonoBehaviour.print("HandleFailedToReceiveAd event received with message: "
                        + args.Message);
}

public void HandleOnAdOpened(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdOpened event received");
}

public void HandleOnAdClosed(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdClosed event received");
}

public void HandleOnAdLeavingApplication(object sender, EventArgs args)
{
    MonoBehaviour.print("HandleAdLeavingApplication event received");
}

OnAdFailedToLoad 事件包含特殊的事件参数。该事件会传递一个 HandleAdFailedToLoadEventArgs 实例,其中包含了用于描述错误的 Message

public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
{
    print("Interstitial failed to load: " + args.Message);
    // Handle the ad failed to load event.
}
广告事件说明
OnAdLoaded 广告加载完成时,系统会执行 OnAdLoaded 事件。
OnAdFailedToLoad 广告加载失败时,系统会调用 OnAdFailedToLoad 事件。Message 参数用于描述发生了何种类型的失败。
OnAdOpening 在广告开始展示并铺满设备屏幕时,系统会调用此方法。
OnAdClosed 此方法会在用户点按“关闭”图标或使用“返回”按钮关闭插页式广告时被调用。如果您的应用暂停了音频输出或游戏循环,则非常适合使用此方法恢复这些活动。
OnAdLeavingApplication 用户点击打开其他应用(例如,Google Play 商店)时,系统会先调用 OnAdOpened,再调用此方法,从而在后台运行当前应用。

清理插页式广告

创建完 InterstitialAd 后,请确保在放弃对它的引用前调用 Destroy() 方法。

interstitial.Destroy();

这会通知插件已不再使用该对象,且可回收它占用的内存。此方法调用失败将导致内存泄漏。

一些最佳做法

考虑插页式广告这种广告类型是否适合您的应用。
在具有自然过渡点的应用中,插页式广告的效果最好。此类过渡点通常存在于应用内的任务结束时,例如分享完图片或完成一个游戏关卡时。用户希望可以在操作过程中休息一下,因此这时展示插页式广告不会影响用户体验。请务必考虑在应用流程的哪些时间点展示插页式广告,以及用户可能会以什么方式响应。
务必在展示插页式广告时暂停操作。
插页式广告类型多样,包括文字广告、图片广告和视频广告等。确保应用在展示插页式广告时,也会暂停使用某些资源,以便供广告使用,这一点十分重要。例如,当您发出展示插页式广告的调用后,请务必暂停应用产生的所有音频输出。您可以在 onAdClosed() 事件处理脚本中恢复声音播放,该处理脚本会在用户结束与广告的互动之后被调用。此外,请考虑在广告展示时暂时停止所有密集计算任务(例如游戏循环)。这将确保用户不会遇到图像无响应、响应慢或视频卡顿的现象。
留出充足的加载时间。
确保在恰当的时间展示插页式广告十分重要,同样,确保用户无需等待广告加载也十分重要。在您打算调用 show() 前,请事先通过调用 loadAd() 加载广告,这可确保应用在广告展示时间到来前已加载完插页式广告。
不要向用户展示太多广告。
虽然提高插页式广告在应用中的展示频率似乎是增加收入的绝佳方式,但这么做也会影响用户体验并降低点击率。所以要确保用户不会频繁受到干扰,使其可以享受使用应用的过程。

其他资源

示例

成功案例

后续步骤