开屏广告是一种特殊的广告格式,适合希望创收的发布商 应用加载屏幕开屏广告可以随时关闭 。
开屏广告会自动在一小块区域内展示品牌信息,让用户知道他们是在 。开屏广告的外观示例如下:
前提条件
- 完成入门指南。
- Unity 插件 7.1.0 或更高版本。
始终使用测试广告进行测试
以下示例代码包含一个广告单元 ID,可用于请求 测试广告。该测试广告单元已经过专门配置 会返回测试广告 制作出来的广告,确保安全使用。
不过,当您在 AdMob 网页界面并创建您自己的广告单元 要在您的应用中使用的 ID,请明确将设备配置为测试 设备 开发。
Android
ca-app-pub-3940256099942544/9257395921
iOS
ca-app-pub-3940256099942544/5575463023
实现
植入开屏广告的主要步骤如下:
- 创建实用程序类
- 加载开屏广告
- 监听开屏广告事件
- 考虑广告有效期
- 监听应用状态事件
- 展示开屏广告
- 清理开屏广告
- 预加载下一个开屏广告
创建实用程序类
创建一个名为 AppOpenAdController
的新类来加载广告。此课程
控制实例变量,以跟踪加载的广告和广告单元 ID
不同平台
using System;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
/// <summary>
/// Demonstrates how to use the Google Mobile Ads app open ad format.
/// </summary>
[AddComponentMenu("GoogleMobileAds/Samples/AppOpenAdController")]
public class AppOpenAdController : MonoBehaviour
{
// These ad units are configured to always serve test ads.
#if UNITY_ANDROID
private string _adUnitId = "ca-app-pub-3940256099942544/9257395921";
#elif UNITY_IPHONE
string _adUnitId = "ca-app-pub-3940256099942544/5575463023";
#else
private string _adUnitId = "unused";
#endif
public bool IsAdAvailable
{
get
{
return _appOpenAd != null;
}
}
public void Start()
{
// Initialize the Google Mobile Ads SDK.
MobileAds.Initialize((InitializationStatus initStatus) =>
{
// This callback is called once the MobileAds SDK is initialized.
});
}
/// <summary>
/// Loads the app open ad.
/// </summary>
public void LoadAppOpenAd()
{
}
/// <summary>
/// Shows the app open ad.
/// </summary>
public void ShowAppOpenAd()
{
}
}
加载开屏广告
开屏广告的加载是通过在Load()
AppOpenAd
类。该加载方法需要使用广告单元 ID、
AdRequest
对象,以及一个完成处理程序,
会在广告加载成功或失败时调用。加载的 AppOpenAd
对象为
完成处理程序中作为参数提供。以下示例展示了
以加载 AppOpenAd
。
// These ad units are configured to always serve test ads.
#if UNITY_ANDROID
private string _adUnitId = "ca-app-pub-3940256099942544/9257395921";
#elif UNITY_IPHONE
string _adUnitId = "ca-app-pub-3940256099942544/5575463023";
#else
private string _adUnitId = "unused";
#endif
private AppOpenAd appOpenAd;
/// <summary>
/// Loads the app open ad.
/// </summary>
public void LoadAppOpenAd()
{
// Clean up the old ad before loading a new one.
if (appOpenAd != null)
{
appOpenAd.Destroy();
appOpenAd = null;
}
Debug.Log("Loading the app open ad.");
// Create our request used to load the ad.
var adRequest = new AdRequest();
// send the request to load the ad.
AppOpenAd.Load(_adUnitId, adRequest,
(AppOpenAd ad, LoadAdError error) =>
{
// if error is not null, the load request failed.
if (error != null || ad == null)
{
Debug.LogError("app open ad failed to load an ad " +
"with error : " + error);
return;
}
Debug.Log("App open ad loaded with response : "
+ ad.GetResponseInfo());
appOpenAd = ad;
RegisterEventHandlers(ad);
});
}
监听开屏广告事件
要进一步自定义您的广告行为,您可以加入许多 事件:打开、关闭等。监听 注册 delegate 以控制这些事件,如下所示。
private void RegisterEventHandlers(AppOpenAd ad)
{
// Raised when the ad is estimated to have earned money.
ad.OnAdPaid += (AdValue adValue) =>
{
Debug.Log(String.Format("App open ad paid {0} {1}.",
adValue.Value,
adValue.CurrencyCode));
};
// Raised when an impression is recorded for an ad.
ad.OnAdImpressionRecorded += () =>
{
Debug.Log("App open ad recorded an impression.");
};
// Raised when a click is recorded for an ad.
ad.OnAdClicked += () =>
{
Debug.Log("App open ad was clicked.");
};
// Raised when an ad opened full screen content.
ad.OnAdFullScreenContentOpened += () =>
{
Debug.Log("App open ad full screen content opened.");
};
// Raised when the ad closed full screen content.
ad.OnAdFullScreenContentClosed += () =>
{
Debug.Log("App open ad full screen content closed.");
};
// Raised when the ad failed to open full screen content.
ad.OnAdFullScreenContentFailed += (AdError error) =>
{
Debug.LogError("App open ad failed to open full screen content " +
"with error : " + error);
};
}
考虑广告有效期
为确保您不会展示过期的广告,请在 AppOpenAdController
中添加一个方法,用于检查广告加载后经过了多长时间。然后,使用该方法检查广告是否仍然有效。
开屏广告的超时时间为 4 小时。在 _expireTime
中缓存加载时间
变量。
// send the request to load the ad.
AppOpenAd.Load(_adUnitId, adRequest,
(AppOpenAd ad, LoadAdError error) =>
{
// If the operation failed, an error is returned.
if (error != null || ad == null)
{
Debug.LogError("App open ad failed to load an ad with error : " +
error);
return;
}
// If the operation completed successfully, no error is returned.
Debug.Log("App open ad loaded with response : " + ad.GetResponseInfo());
// App open ads can be preloaded for up to 4 hours.
_expireTime = DateTime.Now + TimeSpan.FromHours(4);
_appOpenAd = ad;
});
更新 IsAdAvailable
属性,以检查 _expireTime
以确认已加载
仍然有效。
public bool IsAdAvailable
{
get
{
return _appOpenAd != null
&& _appOpenAd.IsLoaded()
&& DateTime.Now < _expireTime;
}
}
监听应用状态事件
使用 AppStateEventNotifier
监听应用前台和
后台事件无论何时,此类都会引发 AppStateChanged
事件。
应用前台或后台运行
private void Awake()
{
// Use the AppStateEventNotifier to listen to application open/close events.
// This is used to launch the loaded ad when we open the app.
AppStateEventNotifier.AppStateChanged += OnAppStateChanged;
}
private void OnDestroy()
{
// Always unlisten to events when complete.
AppStateEventNotifier.AppStateChanged -= OnAppStateChanged;
}
当我们处理 AppState.Foreground
状态和 IsAdAvailable
时
为 true
,我们调用 ShowAppOpenAd()
来展示广告。
private void OnAppStateChanged(AppState state)
{
Debug.Log("App State changed to : "+ state);
// if the app is Foregrounded and the ad is available, show it.
if (state == AppState.Foreground)
{
if (IsAdAvailable)
{
ShowAppOpenAd();
}
}
}
展示开屏广告
若要展示已加载的开屏广告,请对Show()
AppOpenAd
实例。每次加载时,广告仅可展示一次。使用 CanShowAd()
方法,以验证广告是否已准备好进行展示。
/// <summary>
/// Shows the app open ad.
/// </summary>
public void ShowAppOpenAd()
{
if (appOpenAd != null && appOpenAd.CanShowAd())
{
Debug.Log("Showing app open ad.");
appOpenAd.Show();
}
else
{
Debug.LogError("App open ad is not ready yet.");
}
}
清理开屏广告
完成 AppOpenAd
后,请务必调用 Destroy()
方法:
appOpenAd.Destroy();
这会通知插件该对象已不再使用,以及 可收回。此方法调用失败会导致内存泄漏。
预加载下一个开屏广告
AppOpenAd
是一次性对象。这意味着,开屏广告展示后
无法再次使用该对象。若要再请求一个开屏广告,请执行以下操作:
您需要创建一个新的 AppOpenAd
对象。
若要为下一次展示机会准备好开屏广告,请预加载
开屏广告OnAdFullScreenContentClosed
或
引发了 OnAdFullScreenContentFailed
广告事件。
private void RegisterReloadHandler(AppOpenAd ad)
{
...
// Raised when the ad closed full screen content.
ad.OnAdFullScreenContentClosed += ()
{
Debug.Log("App open ad full screen content closed.");
// Reload the ad so that we can show another as soon as possible.
LoadAppOpenAd();
};
// Raised when the ad failed to open full screen content.
ad.OnAdFullScreenContentFailed += (AdError error) =>
{
Debug.LogError("App open ad failed to open full screen content " +
"with error : " + error);
// Reload the ad so that we can show another as soon as possible.
LoadAppOpenAd();
};
}
冷启动和加载屏幕
到目前为止,本文档假定您仅在用户 让应用在内存中挂起时进入前台运行“冷启动”出现以下情况: 您的应用已启动,但之前未在内存中挂起。
冷启动的一个示例是用户首次打开您的应用。 采用冷启动时,您将无法在之前加载的开屏广告 立即展示从您请求广告到收到广告之间的延迟时间 可能会导致用户能够在使用应用之前 用户意外看到与广告内容不符的广告应该避免这种情况 用户体验不佳。
若要在冷启动时使用开屏广告,首选方式是使用加载屏幕 来加载游戏或应用素材资源,并且仅在加载时展示广告 屏幕。如果您的应用已加载完毕,并且用户已经转至主应用, 不要展示广告。
最佳做法
借助开屏广告,您可以在应用首次加载时通过应用的加载屏幕创收 启动和应用切换期间,但重要的是始终遵循以下 确保用户享受使用应用的乐趣
- 在用户使用几次您的应用后展示您的第一个开屏广告。
- 在用户等待的时段展示开屏广告 加载您的应用
- 如果开屏广告和加载屏幕下方有加载屏幕
广告加载完毕之前,请关闭加载屏幕
OnAdDidDismissFullScreenContent
事件处理脚本。 - 在 iOS 平台上,
AppStateEventNotifier
会实例化AppStateEventClient GameObject
。必须填写此GameObject
,才能参加活动 别毁了它如果GameObject
: 已销毁。
其他资源
- HelloWorld 示例: 所有广告格式的最少植入。