このガイドは、アプリ起動時広告を組み込んでいるパブリッシャー様を対象としています。
アプリ起動時広告は、アプリの読み込み画面を収益化したいパブリッシャー向けの特別な広告フォーマットです。アプリ起動時広告は、ユーザーによっていつでも閉じることができます。アプリ起動時広告は、ユーザーがアプリをフォアグラウンド表示したときに表示されます。
アプリ起動時広告では、小さなブランド領域が自動的に表示されるため、ユーザーはアプリを操作していることがわかります。アプリ起動時広告は、次のような表示になります。
アプリ起動時広告を実装するために必要な主な手順は次のとおりです。
AppDelegate
にメソッドを追加して、GADAppOpenAd
を読み込んで表示します。- アプリのフォアグラウンド イベントを検出します。
- プレゼンテーション コールバックを処理する。
前提条件
テストは必ずテスト広告で行う
アプリの作成とテストでは必ずテスト広告を使用し、配信中の実際の広告は使用しないでください。実際の広告を使用すると、アカウントが停止される可能性があります。
下記のアプリ起動時広告専用のテスト広告ユニット ID を使うと、テスト広告を簡単に読み込むことができます。
/6499/example/app-open
この ID は、すべてのリクエストに対してテスト広告を返すように構成されており、アプリのコーディング、テスト、デバッグで自由に使うことができます。なお、テスト用 ID は、アプリを公開する前に必ずご自身の広告ユニット ID に置き換えてください。
Mobile Ads 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
リクエスト メソッドと表示メソッドは、AppDelegate
クラスの外部からアクセスできるようにして、iOS 13 以降を搭載したデバイスで UISceneDelegate
から呼び出せるようにする必要があります。これについては後で詳しく説明します。
AppDelegate.m
に requestAppOpenAd
メソッドを追加します。
- (void)requestAppOpenAd {
self.appOpenAd = nil;
[GADAppOpenAd loadWithAdUnitID:@"/6499/example/app-open"
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:@"/6499/example/app-open"
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:@"/6499/example/app-open"
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];
}
}
コールド スタートと読み込み画面
上記のドキュメントでは、メモリ内でアプリが一時停止しているときにユーザーがアプリをフォアグラウンド表示したときにのみ、アプリ起動時広告を表示することを前提としています。「コールド スタート」は、アプリを起動したが、以前にメモリで一時停止していなかったときに発生します。
コールド スタートの例としては、ユーザーが初めてアプリを開いた場合が挙げられます。コールド スタートでは、以前に読み込まれたアプリ起動時広告を直ちに表示することはできません。広告をリクエストしてから広告が返されるまでには、遅延が発生するため、ユーザーがアプリを少しの間だけアプリを使用できる状態になっていて、コンテキスト外の広告に驚かれる可能性があります。ユーザー エクスペリエンスが低下するため、これを避ける必要があります。
コールド スタートでアプリ起動時広告を使用する場合、読み込み画面を使用してゲームまたはアプリアセットを読み込むこと、そして読み込み画面からのみ広告を表示することが推奨されます。アプリの読み込みが完了し、アプリのメイン コンテンツにユーザーを誘導した場合は、広告を表示しない。
ベスト プラクティス
アプリ起動時広告は、アプリの読み込み画面を収益化できるように作成されましたが、ユーザーがアプリを快適に利用できるよう、以下の点に留意してください。
- アプリ起動時広告を初めて表示するのは、アプリを数回使用した後です。
- 本来はユーザーがアプリの読み込みを待っているときに、アプリ起動時広告を表示します。
- アプリ起動時広告の下に読み込み画面があり、広告が閉じられる前に読み込み画面の読み込みが完了した場合は、
adDidDismissFullScreenContent
メソッドで読み込み画面を閉じることをおすすめします。
GitHub の完全なサンプル
次のステップ
詳しくは、ユーザーのプライバシーについての記事をご覧ください。