App open ads는 interstitial ads와 유사하지만, 사용자가 앱을 soft launch하거나 cold start할 때 표시됩니다.
Fire OS 애플리케이션은 지원되지 않습니다.
App Open Ad 포맷을 구현할 때는 항상 retention을 고려해야 합니다.
App open ads의 경우 다양한 구현 전략 중에서 선택할 수 있습니다.
AppLovin은 아래에 설명된 기술 중 하나 이상을 사용하여 테스트할 것을 권장합니다. 각 애플리케이션은 retention이나 앱 내 체류 시간에 영향을 주지 않으면서 수익을 극대화할 수 있는 고유한 구성을 가지고 있습니다. 사용자 행동과 인게이지먼트는 변경될 수 있으므로, AppLovin은 App Open Ads 전략을 자주 재테스트할 것을 권장합니다. App Open Ads를 테스트하는 데 사용할 수 있는 몇 가지 구현 기술은 다음과 같습니다:
사용자가 애플리케이션을 포그라운드로 가져올 때 app open ad가 준비되어 있도록 하려면, app open ad를 미리 로드(preload)해 두세요. 광고가 표시되기 전에 광고 요청을 수행하는 유틸리티 클래스를 구현하세요. 광고가 준비되었을 때 광고를 표시하는 메서드를 만들고, 사용자가 앱을 포그라운드로 가져올 때 해당 메서드를 호출합니다.
그러면 앱은 앱이 열릴 때 광고 표시를 시도하거나, 미리 로드된 광고가 없는 경우 광고를 로드합니다.
앱이 앱 포그라운딩 이벤트 알림을 받을 수 있도록 WidgetsBindingObserver를 등록하세요.
didChangeAppLifecycleState 메서드를 오버라이드합니다.
이를 통해 앱에 앱 실행 및 포그라운딩 이벤트가 알림으로 전송되어 광고를 표시할 수 있게 됩니다.
광고를 요청하는 시점과 표시할 광고를 수신하는 시점 사이에는 지연이 존재합니다. 앱을 제대로 설계하지 않으면 사용자가 잠시 앱을 보았다가 맥락 없이 갑자기 나타나는 광고에 놀랄 수 있습니다. 이러한 나쁜 사용자 경험을 방지하세요. 앱 콘텐츠가 표시되기 전에 로딩 화면을 보여주고, 로딩 화면이 끝난 후에 광고를 보여주는 방식으로 cold starts를 처리할 수 있습니다. 로딩 화면 이후에 앱 콘텐츠가 이미 표시되었다면 광고를 보여주지 마세요.
app open ad 아래에 로딩 화면이 있고, 사용자가 광고를 닫기 전에 해당 로딩 화면이 완료되는 경우, onAdHiddenCallback 메서드에서 로딩 화면을 닫을 수 있습니다.
이 코드 예제는 앱이 메모리에 일시 중단되어 있는 “soft launch” 상태에서만 app open ads가 표시된다고 가정합니다. 스플래시/로딩 화면은 포함되어 있지 않습니다. 앱 개발자는 스플래시/로딩 화면을 직접 처리해야 합니다. Best practices를 참조하세요.
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.detached:
case AppLifecycleState.hidden:
case AppLifecycleState.inactive:
case AppLifecycleState.paused:
break;
}
}
Future<void> showAdIfReady() async {
if (!_isInitialized) {
return;
}
bool isReady = (await AppLovinMAX.isAppOpenAdReady(_appOpenAdUnitId))!;
if (isReady) {
AppLovinMAX.showAppOpenAd(_appOpenAdUnitId);
} else {
AppLovinMAX.loadAppOpenAd(_appOpenAdUnitId);
}
}
⋮
}
| Ad network | Minimum adapter version |
|---|---|
| BIGO Ads | 4.5.1.0 (Android), 4.2.1.0 (iOS) |
| Google Bidding and 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) |