앱 실행 광고
앱 실행 광고는 앱의 스플래시 화면을 수익화하기 위한 특별한 광고 형식입니다. 광고는 언제든지 해제할 수 있으며, 사용자가 앱을 전면으로 가져올 때, 즉 앱을 시작할 때 또는 백그라운드에서 돌아올 때 표시되도록 설계되었습니다.
이 가이드는 Flutter 앱에 앱 실행 광고를 통합하는 방법을 보여줍니다. 코드 예시와 지침 외에도 형식별 권장 사항 및 추가 리소스에 대한 링크가 포함되어 있습니다.
Внимание
앱 실행 광고는 세로 방향의 애플리케이션에만 배치할 수 있습니다. 가로 방향에서는 광고가 선택되지 않습니다.
레이아웃
앱 실행 광고에는 Go to the app 버튼이 포함되어 있어 사용자가 자신이 앱에 있다는 것을 인지하고 광고를 종료할 수 있습니다. 다음은 광고가 어떻게 표시되는지에 대한 예시입니다.
사전 준비
- Yandex Mobile Ads Flutter Plugin을 통합하려면 빠른 시작의 프로세스를 수행하세요.
- 최신 Yandex Mobile Ads Flutter Plugin 버전을 사용하고 있는지 확인하세요. 중재를 사용하는 경우, 최신 통합 빌드 버전을 실행하고 있는지 확인하세요.
용어 및 정의
- 콜드 스타트는 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
: 파트너 인터페이스에서 발급된 고유 식별자로, 다음과 같이 표시됩니다. R-M-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를 생성했습니다. 광고 통합을 확인하는 데 사용하세요.
데모 adUnitId: 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를 생성했습니다. 광고 통합을 확인하는 데 사용하세요.
데모 adUnitId: demo-appopenad-yandex
.
Важно
앱을 스토어에 게시하기 전에 데모 광고 배치 ID를 Partner Interface에서 가져온 실제 ID로 교체해야 합니다.
사용 가능한 데모 광고 배치 ID 목록은 테스트용 데모 광고 단위 섹션에서 찾을 수 있습니다.
광고 통합 테스트
네이티브 콘솔 도구를 사용하여 광고 통합을 테스트할 수 있습니다.
자세한 로그를 보려면 YMAMobileAds
클래스의 enableLogging
메서드를 호출하세요.
YMAMobileAds.enableLogging()
SDK 로그를 보려면 콘솔 도구로 이동하여 Subsystem = com.mobile.ads.ads.sdk
를 설정하세요. 카테고리와 오류 수준별로 로그를 필터링할 수도 있습니다.
광고 통합에 문제가 있는 경우, 문제에 대한 상세한 보고서와 해결 방법에 대한 권장 사항을 받게 됩니다.

권장 사항
-
시작 화면 전에 앱 실행 광고를 렌더링하지 마세요.
시작 화면을 표시함으로써 사용자의 앱 경험을 향상시켜 더 매끄럽고 즐거운 경험을 제공합니다. 그러면 사용자가 놀라거나 혼란스러워하지 않고 원하는 앱을 열었다는 확신을 얻을 수 있습니다. 같은 화면에서 예정된 광고에 대해 사용자에게 알릴 수 있습니다. 로딩 표시기를 사용하거나 광고 후에 앱 콘텐츠를 다시 볼 수 있다는 텍스트 메시지를 사용하면 됩니다.
-
광고 요청과 렌더링 사이에 지연이 있으면 사용자가 앱을 잠시 실행했다가 예상치 못하게 콘텐츠와 관련 없는 광고를 볼 수 있습니다. 그러면 사용자 경험에 부정적인 영향을 미칠 수 있으므로 이러한 상황은 방지해야 합니다. 한 가지 해결책은 메인 앱 콘텐츠를 표시하기 전에 시작 화면을 사용하고 이 화면에서 광고 렌더링을 시작하는 것입니다. 시작 화면 후에 앱이 일부 콘텐츠를 열면 광고를 렌더링하지 않는 것이 좋습니다.
-
새로운 사용자가 앱을 실행하여 몇 차례 사용할 때까지 기다린 후에 앱 실행 광고를 렌더링하세요. 앱에서 특정 기준을 충족한 사용자에게만 광고를 렌더링하세요(예: 특정 레벨을 통과했거나, 앱을 특정 횟수만큼 실행했거나, 보상 제공에 참여하지 않는 경우 등). 앱 설치 직후에 광고를 렌더링하지 마세요.
-
앱 사용자 행동에 따라 광고 렌더링 빈도를 조절하세요. 앱을 콜드/핫 스타트할 때마다 광고를 렌더링하지 마세요.
-
앱이 일정 시간 동안 백그라운드에 있었을 때만 광고를 렌더링하세요(예: 30초, 2분, 15분).
-
각 앱은 고유하며, 유지 시간이나 앱 사용 시간을 줄이지 않으면서 수익을 극대화하는 특별한 접근법이 필요하므로 철저한 테스트를 수행해야 합니다. 사용자 행동과 참여는 시간이 지남에 따라 변할 수 있으므로 앱 실행 광고에 사용하는 전략을 주기적으로 테스트할 것을 권장합니다.
추가 리소스
통합에 대한 전체 예시를 여기서 확인하세요.