开屏广告
开屏广告是一种特殊的广告形式,通过应用程序的初始屏幕盈利。用户可随时关闭这些广告,其设计是用户在前台开启应用程序时展示广告,而无论是在启动时还是从后台返回时。
本指南将展示如何将开屏广告集成到 Flutter 应用中。除了代码示例和说明之外,它还包含特定格式的建议和其他资源的链接。
限制
开屏广告只能投放在垂直方向的应用程序中。对于水平方向,不会选择这种广告。
布局
开屏广告包含 登录应用程序 按钮,以便用户知道他们正在使用您的应用并可以关闭广告。以下是广告的示例:
前提条件
- 按照 快速入门 中的流程集成 Yandex Mobile Ads Flutter 插件。
- 确保您运行的是最新的 Yandex Mobile Ads Flutter 插件 版本。如果您使用聚合,请确保您运行的是最新版本的 统一构建。
术语和定义
- 冷启动 是指启动一个不在 RAM 中的应用,创建一个新的应用会话。
- 热启动 是指当应用在 RAM 中暂停时,将应用从后台模式切换到前台模式。
实施
- 创建
AppOpenAdLoader
广告加载器并安装广告加载事件的回调函数。 - 在
AdRequestConfiguration
中设置广告加载参数。 - 使用
AppOpenAdLoader.LoadAd(AdRequestConfiguration)
方法加载广告。 - 使用
WidgetsBindingObserver
接口中的didChangeAppLifecycleState
方法来处理应用状态变化并显示开屏广告。 - 为用户与您的广告互动的事件安装回调函数。
- 通过调用
AppOpenAd.Show()
方法展示广告。 - 释放资源。
主要步骤
-
创建
AppOpenAdLoader
广告加载器并注册广告加载事件的监听器。@override void initState() { super.initState(); MobileAds.initialize(); _appOpenAdLoader = _createAppOpenAdLoader(); } late final Future<AppOpenAdLoader> _appOpenAdLoader; AppOpenAd? _appOpenAd; Future<AppOpenAdLoader> _createAppOpenAdLoader() { return AppOpenAdLoader.create( onAdLoaded: (AppOpenAd appOpenAd) { // 广告加载成功。现在您可以处理它了。 _appOpenAd = appOpenAd; }, onAdFailedToLoad: (error) { // 广告加载失败并出现错误 // 强烈建议不要尝试从 OnAdFailedToLoad 事件加载新广告。 }, ); }
-
在
AdRequestConfiguration
中设置广告加载参数。final _adUnitId = 'demo-appopenad-yandex'; // 替换为 "R-M-XXXXXX-Y" late var _adRequestConfiguration = AdRequestConfiguration(adUnitId: _adUnitId);
AdUnitId
:在合作伙伴界面中发布的唯一标识符,格式为:RM-XXXXXX-Y。提示
出于测试目的,您可以使用演示广告单元 ID:"demo-appopenad-yandex"。在发布广告之前,请确保将演示单元 ID 替换为真实的广告单元 ID。
您可以使用
AdRequestConfiguration
扩展广告请求参数,将用户兴趣、上下文页面数据、位置详细信息或其他数据作为附加参数传递。在请求中提供额外的上下文数据可以显著提高您的广告质量。 -
使用
LoadAd
方法加载广告,并将AdRequestConfiguration
作为参数传递。Future<void> _loadAppOpenAd() async { final adLoader = await _appOpenAdLoader; await adLoader.loadAd(adRequestConfiguration: _adRequestConfiguration); }
-
使用
WidgetsBindingObserver
接口中的didChangeAppLifecycleState
方法来处理应用状态变化并显示开屏广告。@override void initState() { super.initState(); // ... WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { _showAdIfAvailable(); } }
-
注册用户与您的广告互动的事件的监听器。
static var isAdShowing = false; void _setAdEventListener({required AppOpenAd appOpenAd }) { appOpenAd.setAdEventListener( eventListener: AppOpenAdEventListener( onAdShown: () { // 广告展示时调用。 isAdShowing = true; }, onAdFailedToShow: (error) { // 广告展示失败时调用。 isAdShowing = false; // 广告关闭后清除资源。 _clearAppOpenAd(); // 现在您可以预加载下一个广告。 _loadAppOpenAd(); }, onAdDismissed: () { // 广告关闭时调用。 isAdShowing = false; // 清除资源。 _clearAppOpenAd(); // 现在您可以预加载下一个广告。 _loadAppOpenAd(); }, onAdClicked: () { // 记录广告点击时调用。 }, onAdImpression: (data) { // 记录广告展示次数时调用。 } ) ); }
-
通过调用
AppOpenAd.Show()
方法展示广告。Future<void> _showAdIfAvailable() async { var appOpenAd = _appOpenAd; if (appOpenAd != null && !isAdShowing) { _setAdEventListener(appOpenAd: appOpenAd); await appOpenAd.show(); await appOpenAd.waitForDismiss(); } else { _loadAppOpenAd(); } }
-
如果您不再使用所显示广告的链接,请清除它们。这可以释放资源并防止内存泄漏。
void _clearAppOpenAd() { _appOpenAd?.destroy(); _appOpenAd = null; }
完整代码示例
class _AppOpenAdPageState extends State<AppOpenAdPage> with WidgetsBindingObserver {
final _adUnitId = 'demo-appopenad-yandex';
late var _adRequestConfiguration = AdRequestConfiguration(adUnitId: _adUnitId);
AppOpenAd? _appOpenAd;
late final Future<AppOpenAdLoader> _appOpenAdLoader = _createAppOpenAdLoader();
static var isAdShowing = false;
static var isColdStartAdShown = false;
Future<AppOpenAdLoader> _createAppOpenAdLoader() {
return AppOpenAdLoader.create(
onAdLoaded: (AppOpenAd appOpenAd) {
// 广告加载成功。现在您可以处理它了。
_appOpenAd = appOpenAd;
if (!isColdStartAdShown) {
_showAdIfAvailable();
isColdStartAdShown = true;
}
},
onAdFailedToLoad: (error) {
// 广告加载失败
// 强烈建议不要尝试从 OnAdFailedToLoad 事件加载新广告。
},
);
}
@override
void initState() {
super.initState();
MobileAds.initialize();
_appOpenAdLoader = _createAppOpenAdLoader();
_loadAppOpenAd();
WidgetsBinding.instance.addObserver(this);
}
Future<void> _loadAppOpenAd() async {
final adLoader = await _appOpenAdLoader;
await adLoader.loadAd(adRequestConfiguration: _adRequestConfiguration);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_showAdIfAvailable();
}
}
void _setAdEventListener({required AppOpenAd appOpenAd }) {
appOpenAd.setAdEventListener(
eventListener: AppOpenAdEventListener(
onAdShown: () {
// 广告展示时调用。
isAdShowing = true;
},
onAdFailedToShow: (error) {
// 广告展示失败时调用。
// 广告关闭后清除资源。
_clearAppOpenAd();
// 现在您可以预加载下一个广告。
_loadAppOpenAd();
},
onAdDismissed: () {
// 广告关闭时调用。
isAdShowing = false;
// 清除资源。
_clearAppOpenAd();
// 现在您可以预加载下一个广告。
_loadAppOpenAd();
},
onAdClicked: () {
// 记录广告点击时调用。
},
onAdImpression: (data) {
// 记录广告展示次数时调用。
}
)
);
}
Future<void> _showAdIfAvailable() async {
var appOpenAd = _appOpenAd;
if (appOpenAd != null && !isAdShowing) {
_setAdEventListener(appOpenAd: appOpenAd);
await appOpenAd.show();
await appOpenAd.waitForDismiss();
} else {
loadAppOpenAd();
}
}
void _clearAppOpenAd() {
_appOpenAd?.destroy();
_appOpenAd = null;
}
}
开屏广告集成的特点
- 加载可能需要一段时间,因此如果广告尚未加载,请勿增加冷启动时间。
- 预加载广告以便后续在热启动期间显示。
- 我们不建议您在应用启动期间同时加载开屏广告和其他广告格式,因为此时应用可能正在下载运营数据。这可能会使设备和互联网连接超载,从而导致广告加载时间变长。
- 如果您在
onAdFailedToLoad
事件中收到错误,请不要尝试再次加载新广告。如果必须这样做,请限制广告重新加载尝试的次数。这将有助于避免出现限制时持续出现不成功的请求和连接问题。
在发布时测试广告集成
使用演示广告单元进行广告测试
我们建议使用测试广告来测试开屏广告集成和应用本身。
为了保证为每个广告请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。
演示广告单元 ID:demo-appopenad-yandex
。
重要
在商店中发布您的应用之前,请确保将演示广告版位 ID 替换为从 Partner Interface 获取的真实广告版位 ID。
您可以在 用于测试的演示广告单元 版块找到可用的演示广告版位 ID 列表。
测试广告集成
您可以使用 SDK 的内置分析器检查开屏广告集成。
该工具可确保您的开屏广告正确集成,并向日志输出详细报告。 要查看报告,请在用于 Android 应用调试的 Logcat 工具中搜索“YandexAds”关键字。
adb logcat -v brief '*:S YandexAds'
如果集成成功,您将看到以下消息:
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type App Open Ad was integrated successfully
如果您在集成广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。
使用演示广告单元进行广告测试
我们建议使用测试广告来测试开屏广告集成和应用本身。
为了保证为每个广告请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。
演示广告单元 ID:demo-appopenad-yandex
。
重要
在商店中发布您的应用之前,请确保将演示广告版位 ID 替换为从 Partner Interface 获取的真实广告版位 ID。
您可以在 用于测试的演示广告单元 版块找到可用的演示广告版位 ID 列表。
测试广告集成
您可以使用本机控制台工具测试广告集成。
要查看详细日志,请调用 YMAMobileAds
类的 enableLogging
方法。
YMAMobileAds.enableLogging()
要查看 SDK 日志,请前往控制台工具并设置 sybsystem = com.yandex.mobile.ads.sdk
。您还可以按类别和错误级别过滤日志。
如果您在集成广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。
建议
-
不要在启动屏幕之前呈现开屏广告。
通过显示启动屏幕,您可以增强用户的应用体验,使其更加流畅,令用户愉悦。这将避免用户感到惊讶或困惑,并确保他们打开了正确的应用。在同一屏幕上,您可以提醒用户即将展示的广告。使用加载指示器或简单的文本信息告知用户他们将在广告结束后继续查看应用内容。
-
如果请求和呈现广告之间存在延迟,用户可能会短暂打开您的应用,然后意外地看到与内容无关的广告。这会对用户体验产生负面影响,因此需要避免。一种解决方案是在显示主应用内容之前使用启动屏幕,并从该屏幕开始广告呈现。如果应用在启动屏幕后打开一些内容,则最好不要呈现广告。
-
等到新用户打开应用并使用几次后,再呈现开屏广告。仅向应用中满足特定条件的用户呈现广告(例如,通过了特定级别、打开了特定次数的应用或未参与奖励优惠)。不要在用户安装应用后立即呈现广告。
-
根据应用用户行为调节广告呈现频率。不要在每次冷/热应用启动时呈现广告。
-
仅当应用在后台运行一段时间(例如 30 秒、2 分钟、15 分钟)时才呈现广告。
-
确保运行了彻底的测试,因为每款应用都是独特的,并且需要特殊的方法来最大限度地提高收入,而不降低用户留存率或减少花费在应用上的时间。用户行为和参与度可能会随着时间的推移而发生变化,因此我们建议定期测试您用于开屏广告的策略。
其他资源
您可以在此处查找完整的集成示例: