AppLovin Flutter Plugin 2.3.0 引入了应用开屏广告格式。 应用开屏广告与插屏广告类似,但会在用户热启动或冷启动应用时展示:
不支持 Fire OS 应用。
在采用开屏广告格式时,请始终考虑用户留存问题。
针对应用开屏广告,您可以选择多种实施策略。
AppLovin recommends that you test by using one or more of the techniques described below. Each application has a unique configuration that allows it to maximize revenue without impacting retention or time spent in the app. User behavior and engagement may change, so AppLovin recommends that you retest your App Open Ads strategies often. Some implementation techniques you may use to test App Open Ads include:
为确保在应用转到前台时应用开屏广告已准备就绪,您需要预加载一则应用开屏广告。 实现一个工具类,用于在展示广告之前发送广告请求。 创建一个在广告就绪时显示广告的方法,并在应用转到前台时调用该方法。 然后,您的应用会尝试在应用打开时展示广告,或在未预加载广告的情况下加载广告。
要获得应用前台事件通知,您需要注册 WidgetsBindingObserver。
重写 didChangeAppLifecycleState 方法,
这样,您的应用就可以收到应用启动和前台事件的通知并展示广告。
请求广告与收到要展示的广告之间存在时间差。 如果应用设计不善,用户会短暂地看到应用,然后突然看到完全无关的广告。 这种现象会损害用户体验,因此应该避免。 处理冷启动的首选方法是在显示任何应用内容之前显示加载界面,在加载界面之后展示广告。 如果应用在加载界面后显示任何应用内容,则不要展示广告。
您可以在应用开屏广告下方显示一个加载界面,并且在广告被关闭之前结束该加载界面。
在这种情况下,您可以在 onAdHiddenCallback 方法中关闭加载界面。
此代码示例假设只有在“热启动”,即应用在内存中挂起时,展示开屏广告。 启动/加载界面不包括在内。 应用开发者必须自行处理启动/加载界面 — 请参阅最佳实践。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
MaxConfiguration? configuration = await AppLovinMAX.initialize(_sdkKey);
if (configuration != null) {
_isInitialized = true;
}
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
if (_isInitialized) {
AppLovinMAX.setAppOpenAdListener(AppOpenAdListener(
onAdLoadedCallback: (ad) {},
onAdLoadFailedCallback: (adUnitId, error) {},
onAdDisplayedCallback: (ad) { },
onAdDisplayFailedCallback: (ad, error) {
AppLovinMAX.loadAppOpenAd(_appOpenAdUnitId);
},
onAdClickedCallback: (ad) {},
onAdHiddenCallback: (ad) {
AppLovinMAX.loadAppOpenAd(_appOpenAdUnitId);
},
onAdRevenuePaidCallback: (ad) {},
));
AppLovinMAX.loadAppOpenAd(_appOpenAdUnitId);
}
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
switch (state) {
case AppLifecycleState.resumed:
await showAdIfReady();
break;
case AppLifecycleState.paused:
case AppLifecycleState.inactive:
case AppLifecycleState.detached:
break;
}
}
Future<void> showAdIfReady() async {
if (!_isInitialized) {
return;
}
bool isReady = (await AppLovinMAX.isAppOpenAdReady(_appOpenAdUnitId))!;
if (isReady) {
AppLovinMAX.showAppOpenAd(_appOpenAdUnitId);
} else {
AppLovinMAX.loadAppOpenAd(_appOpenAdUnitId);
}
}
⋮
}
| 广告平台 | 最低适配器版本 |
|---|---|
| BIGO Ads | 4.5.1.0 (Android), 4.2.1.0 (iOS) |
| Google 竞价和 Google AdMob | 22.2.0.2 (Android),10.9.0.1 (iOS) |
| Liftoff Monetize | 6.12.0.2 (Android),6.12.0.3 (iOS) |
| Mintegral | 16.6.61.1 (Android), 7.2.3.0.1 (iOS) |
| Pangle | 4.6.0.4.0 (Android),4.6.2.2.1 (iOS) |