이 가이드는 앱 오프닝 광고를 통합하려는 게시자를 대상으로 작성되었습니다.
앱 오프닝 광고는 앱 로드 화면으로 수익을 올리려는 게시자를 위한 특별한 광고 형식입니다. 앱 오프닝 광고는 사용자가 언제든지 닫을 수 있습니다. 사용자가 앱을 포그라운드로 가져올 때 앱 오프닝 광고가 표시될 수 있습니다.
앱 오프닝 광고는 사용자가 앱을 사용 중임을 알 수 있도록 작은 브랜딩 영역을 자동으로 표시합니다. 앱 오프닝 광고는 다음과 같이 게재됩니다.
앱 오프닝 광고를 구현하는 데 필요한 단계는 크게 다음과 같이 나눌 수 있습니다.
AppDelegate
에 메서드를 추가하여GADAppOpenAd
를 로드하고 표시합니다.- 앱 포그라운드 이벤트를 감지합니다.
- 프레젠테이션 콜백을 처리합니다.
사전 준비 사항
테스트는 항상 테스트 광고로
앱을 제작하고 테스트할 때는 운영 중인 실제 광고 대신 테스트 광고를 사용하세요. 이렇게 하지 않으면 계정이 정지될 수 있습니다.
테스트 광고를 로드하는 가장 쉬운 방법은 앱 오프닝 광고 전용 테스트 광고 단위 ID를 사용하는 것입니다.
ca-app-pub-3940256099942544/5662855259
이 ID는 모든 요청에 대해 테스트 광고를 반환하도록 특별히 구성되었으며, 코딩, 테스트, 디버깅 중에 앱에서 자유롭게 사용할 수 있습니다. 앱을 게시하기 전에 이 ID를 자체 광고 단위 ID로 바꿔야 합니다.
모바일 광고 SDK의 테스트 광고가 작동하는 방식을 자세히 알아보려면 테스트 광고를 참고하세요.
앱 대리자 수정
앱 오프닝 광고는 애플리케이션이 실행될 때 또는 사용자가 애플리케이션을 포그라운드로 가져올 때 표시됩니다. 사용자가 앱을 열 때 광고가 표시되도록 하려면 사용할 준비가 된 광고에 대한 참조가 있어야 합니다.
즉, 광고를 표시하기 전에 GADAppOpenAd
를 미리 로드해야 합니다.
이렇게 하면 다음번에 앱을 열 때 앱 오프닝 광고가 표시될 수 있습니다. 광고에
대한 단일 참조를 보다 용이하게 사용하려면 AppDelegate.h
에 다음 속성과
메서드를 추가합니다.
#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;
- (void)requestAppOpenAd;
- (void)tryToPresentAd;
@end
iOS 13 이상을 실행하는 기기의 경우 UISceneDelegate
에서 호출할 수 있도록 요청과 현재의 메서드를 AppDelegate
클래스 외부에서
액세스할 수 있게
설정해야 합니다. 이 내용에 관해서는 뒷부분에서 자세히 설명합니다.
AppDelegate.m
에서 다음과 같이 requestAppOpenAd
메서드를 추가합니다.
- (void)requestAppOpenAd {
self.appOpenAd = nil;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
request:[GADRequest request]
orientation:UIInterfaceOrientationPortrait
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
}];
}
이 메서드는 새 GADAppOpenAd
를 로드하도록 요청합니다. 성공할 경우 사용자가
앱을 포그라운드로 가져올 때 광고를 사용할 수 있도록
AppDelegate
의 속성을 설정합니다.
방향을 설정해야 합니다. 방향이 UIInterfaceOrientationUnknown
으로 설정되어
있으면 GADAppOpenAd
는 세로 방향을 가정합니다. 가로 모드 레이아웃을 디자인하려면 요청 메서드에
UIInterfaceOrientationLandscapeLeft
또는 UIInterfaceOrientationLandscapeRight
를 전달하여
가로 방향이 필요하다고
지정해야 합니다.
다음으로 AppDelegate
의 광고를 표시하는 메서드를 추가합니다.
- (void)tryToPresentAd {
if (self.appOpenAd) {
UIViewController *rootController = self.window.rootViewController;
[self.appOpenAd presentFromRootViewController:rootController];
} else {
// If you don't have an ad ready, request one.
[self requestAppOpenAd];
}
}
이 메서드는 광고의 존재를 확인하며, 광고가 존재하여 루트 보기 컨트롤러에서 표시할 수 있는 경우 기존 콘텐츠 위에 해당 광고를 표시합니다. 사용할 수 있는 광고가 없으면 메서드가 새 요청을 수행합니다.
앱 포그라운드 이벤트 감지
사용자가 앱을 처음으로 실행할 때는 광고 참조가 사용 가능한 상태로 준비되어 있을
가능성이 낮습니다. 대신 위에서 정의한 tryToPresentAd
메서드를 사용하여
광고가 있는 경우 이를 표시하거나
새 광고를 요청해야 합니다. 이 메서드는 앱을 포그라운드로 가져올 때마다
호출되어야 합니다. 이렇게 하려면 다음과 같이 AppDelegate
의 applicationDidBecomeActive:
메서드를
재정의하면 됩니다.
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self tryToPresentAd];
}
프레젠테이션 콜백 처리
앱에서 앱 오프닝 광고를 표시할 때는
GADFullScreenContentDelegate
를 사용하여 특정 프레젠테이션 이벤트를 처리해야 합니다. 특히
첫 번째 광고가 표시되면 다음 앱 오프닝 광고를
요청해야 합니다.
AppDelegate.h
파일을 다음과 같이 변경합니다.
#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate
: UIResponder <UIApplicationDelegate, GADFullScreenContentDelegate>
@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;
- (void)requestAppOpenAd;
- (void)tryToPresentAd;
@end
그런 다음 AppDelegate.m 파일에 다음 행을 추가합니다.
- (void)requestAppOpenAd {
self.appOpenAd = nil;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
request:[GADRequest request]
orientation:UIInterfaceOrientationPortrait
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
self.appOpenAd.fullScreenContentDelegate = self;
}];
}
#pragma mark - GADFullScreenContentDelegate
/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
NSLog(@"didFailToPresentFullScreenContentWithError");
[self requestAppOpenAd];
}
/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"adWillPresentFullScreenContent");
}
/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"adDidDismissFullScreenContent");
[self requestAppOpenAd];
}
...
이와 같은 콜백은 앱 오프닝 광고의 수명 주기 동안 다양한 이벤트를 처리합니다.
광고 만료 고려
만료된 광고가 표시되지 않도록 하려면 광고 참조가 로드된 후 경과 시간을 확인하는 메서드를 앱 대리자에 추가하면 됩니다.
AppDelegate.h
에서 NSDate
속성을 추가합니다.
#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;
@property(weak, nonatomic) NSDate *loadTime;
- (void)requestAppOpenAd;
- (void)tryToPresentAd;
@end
광고가 로드된 후 아직 일정 시간이 경과하지 않았으면
true
를 반환하는 메서드를 추가할 수 있습니다.
AppDelegate.m
에서 다음 메서드를 추가합니다.
- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
NSDate *now = [NSDate date];
NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
double secondsPerHour = 3600.0;
double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
return intervalInHours < n;
}
다음 단계는 광고가 로드될 때 loadTime
속성을 설정하는 것입니다.
- (void)requestAppOpenAd {
self.appOpenAd = nil;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
request:[GADRequest request]
orientation:UIInterfaceOrientationPortrait
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
self.appOpenAd.fullScreenContentDelegate = self;
self.loadTime = [NSDate date];
}];
}
마지막으로, 광고를 표시하기 전에 광고 참조의 유효성을 확인해야 합니다.
- (void)tryToPresentAd {
if (self.appOpenAd && [self wasLoadTimeLessThanNHoursAgo:4]) {
UIViewController *rootController = self.window.rootViewController;
[self.appOpenAd presentFromRootViewController:rootController];
} else {
// If you don't have an ad ready, request one.
[self requestAppOpenAd];
}
}
콜드 스타트 및 로드 화면
위 문서에서는 메모리에 일시중지 상태로 있는 앱을 사용자가 포그라운드로 가져올 때만 앱 오프닝 광고를 게재한다고 가정했습니다. '콜드 스타트'는 앱이 메모리에 일시중지 상태로 남아있지 않은 상황에서 앱을 시작하는 경우를 뜻합니다.
콜드 스타트의 한 예는 사용자가 앱을 처음으로 열 때입니다. 콜드 스타트 상황에는 즉시 표시할 수 있도록 미리 로드해둔 앱 오프닝 광고가 없습니다. 광고를 요청하고 광고를 수신하는 시점 사이에 지연 시간이 발생하면 사용자가 그 잠깐 동안 앱을 사용하다가 갑작스럽게 광고가 게재되며 불편을 겪을 수 있습니다. 이는 사용자 경험에 악영향을 미치므로 피해야 합니다.
콜드 스타트가 발생할 때 앱 오프닝 광고를 사용하는 바람직한 방법은 게임 또는 앱 애셋을 로드하기 위한 로드 화면을 사용하고 해당 로드 화면에만 광고를 표시하는 것입니다. 앱에서 로드가 완료되고 사용자에게 앱의 주요 콘텐츠를 전송한 후에는 광고를 표시하지 않아야 합니다.
권장사항
Google에서는 앱 로드 화면을 통해 수익을 창출할 수 있도록 앱 오프닝 광고를 만들었지만, 사용자가 앱을 사용하는 데 불편하지 않도록 권장사항을 고려하는 것이 중요합니다. 이러한 권장사항은 다음과 같습니다.
- 사용자가 앱을 몇 번 사용했을 때까지 기다린 후에 첫 앱 오프닝 광고를 표시합니다.
- 사용자가 앱이 로드되기를 기다리는 동안 앱 오프닝 광고를 표시합니다.
- 앱 오프닝 광고 아래에 로드 화면이 있고 사용자가 광고를 닫기 전에 화면 로드가 완료되면
adDidDismissFullScreenContent
메서드로 로드 화면을 닫는 것이 좋습니다.
GitHub의 예
- 앱 오프닝 광고의 예: Swift | Objective-C