インフィード広告 実装方法
はじまる前に
この実装方法ではアドフリくんSDK 3.3.0から追加されたネイティブ広告をベースに説明をしています。
インフィード広告のタイプによって使われるObject名、Delegate名が違うだけで全体的な実装方法は同じですので、次のテーブルを参考にして差し替えて実装してください。
広告種類 | Class名 | Delegate名 | 広告情報Class名 |
---|---|---|---|
動画ネイティブ | ADFmyMovieNative | ADFmyMovieNativeDelegate | ADFMovieNativeAdInfo |
ネイティブ | ADFmyNativeAd | ADFmyNativeAdDelegate | ADFNativeAdInfo |
モバイルバナー | ADFmyBanner | ADFmyNativeAdDelegate | ADFNativeAdInfo |
レクタングル | ADFmyRectangle | ADFmyNativeAdDelegate | ADFNativeAdInfo |
ADFmyMovieNativeは今後Deprecatedになる予定ですので、ADFmyNativeAdを使っての実装を推奨します。
①アドフリくん動画リワードSDK導入の後、ADFmyNativeAd.h
をインポートします。
#import <ADFMovieReward/ADFmyNativeAd.h>
②利用するアドネットワークのSDKをプロジェクトにimportします。
※各アドネットワークの導入方法については、「CocoaPodsを利用」または「手動で導入する手順」を参照ください。
③サポート対象のOSバージョンかADFmyNativeAd
クラスの下記のstaticメソッドで事前に確認可能です。
+ (BOOL)isSupportedOSVersion;
④アドフリくん管理画面で発行された広告枠IDを指定してADFmyNativeAd
クラスのinitializeWithAppID:
メソッドを呼び、アドフリくんサーバから広告枠の設定情報を取得します。
※広告の準備にある程度時間を要するためapplication:didFinishLaunchingWithOptions:
等での実行をお勧めします。
+ (void)initializeWithAppID:(NSString *)appID;
パラメータ | 説明 |
---|---|
appID |
対象の広告枠ID |
⑤各アドネットワークへ広告の取得リクエストを行います。取得の成功失敗をコールバックで受け取るためにloadAndNotifyTo:
メソッドの引数にデリゲートを指定します。
ネイティブのインスタンスの受け取り
+ (ADFmyNativeAd *)createInstance:(NSString *)appID;
パラメータ | 説明 |
---|---|
appID |
対象の広告枠ID |
アドネットワークから広告の読み込み開始
- (void)loadAndNotifyTo:(id<ADFmyNativeAdDelegate>)delegate;
パラメータ | 説明 |
---|---|
delegate |
デリゲートオブジェクト |
⑥広告の取得状況に関する通知を受け取りたいクラスに下記デリゲートを実装します。
ADFmyNativeAdDelegate
正常系のイベント
- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID;
広告の取得に成功した場合にメインスレッドでコールバックされます。ADFNativeAdInfo
クラスが持っている広告情報を使って広告を表示してください。
パラメータ | 説明 |
---|---|
info |
広告の情報を格納したオブジェクト |
appID |
対象の広告枠ID |
ADFNativeAdInfo
プロパティ | 型 | Null可能 | 説明 |
---|---|---|---|
title |
NSString |
Null可能 | 広告のタイトル |
desc |
NSString |
Null可能 | 広告の説明文 |
mediaView |
ADFMediaView |
広告のView、広告対応によってサイズが違いますので実装側で適切なサイズを指定してください。 |
異常系のイベント
- (void)onNativeAdLoadError:(ADFMovieError *)error appID:(NSString *)appID;
広告の取得に失敗した場合にメインスレッドでコールバックされます。エラーの詳細についてはADFMovieError
クラスを参照してください。
パラメータ | 説明 |
---|---|
error |
エラー内容を格納したオブジェクト |
appID |
対象の広告枠ID |
エラーコードの詳細
タイプ | コード | 内容 |
---|---|---|
ADFMovieError_NoStock |
0 | 広告の在庫がない場合 |
ADFMovieError_NetworkDisconnect |
1 | オフラインまたはフライトモードの場合 |
ADFMovieError_InvalidAppId |
2 | 広告IDが登録されている内容と異なる場合 |
ADFMovieError_ApiRequestFailure |
3 | リクエストが失敗した場合 |
ADFMovieError_UnsupportedOSVersion |
4 | サポートしないOSバージョンの場合 |
ADFMovieError_PlayerItemLoadFailure |
5 | 広告の読み込みが失敗した場合 |
ADFMovieError_PlayerItemPlayFailure |
6 | 広告の再生が失敗した場合 |
ADFMovieError_Other |
7 | その他の予期せぬエラーが発生した場合 |
⑦ ADFNativeAdInfo
のmediaView
を画面上好きなところに張り付き、必要なサイズに変更し、再生する
//サイズを設定
self.nativeAdInfo.mediaView.frame = self.containerView.bounds;
[self.containerView addSubview:self.nativeAd.mediaView];
//動画再生状況のdelegate
self.nativeAd.mediaView.mediaViewDelegate = self;
//動画を再生
[self.nativeAdInfo playMediaView];
⑧ 取得したインスタンスがもう必要なくなったら、メモリから解除する必要があります。広告を表示している画面が破棄されるタイミングなどで次の関数を読み出してインスタンス破棄をしてください。
- (void)dispose;
ADFMediaViewDelegate
mediaView
のmediaViewDelegate
を設定すると、広告の再生状況確認することができます
正常系のイベント
- (void)onADFMediaViewPlayStart; // 動画、静止画
- (void)onADFMediaViewPlayFinish; // 動画のみ
- (void)onADFMediaViewClick; // 静止画のみ
- (void)onADFMediaViewRendering; // 静止画のみ
異常系のイベント
- (void)onADFMediaViewPlayFail;
実装例(詳細はサンプルアプリをご参照ください)
● アプリ起動 〜 事前準備開始
#import <ADFMovieReward/ADFmyNativeAd.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//OSがサポートバージョン以上だったら、広告枠の情報取得開始
if ([ADFmyNativeAd isSupportedOSVersion]) {
[ADFmyNativeAd initializeWithAppID:@”広告枠ID”];
}
}
● デリゲート実装 〜 広告の取得開始 〜 広告の表示
@interface ViewController()<ADFmyNativeAdDelegate>
@property (nonatomic) ADFNativeAdInfo *nativeAdInfo;
@end
@implementation ViewController
- (void)viewDidLoad {
//広告の取得を開始
[[ADFmyNativeAd createInstance:@”広告枠ID”] loadAndNotifyTo:self];
}
#pragma mark - ADFmyMovieNativeDelegate
//広告の取得成功のコールバック
- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID {
self.nativeAdInfo = info;
//広告を表示する処理を実装
}
//広告の取得失敗のコールバック
- (void)onNativeAdLoadError:(ADFMovieError *)error appID:(NSString *)appID {
//エラーの確認、広告取得のリトライなど
}
● 広告の再生開始〜広告のタップ
@implementation ViewController
- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID {
self.nativeAdInfo = info;
//広告を表示する処理を実装
self.nativeAd.mediaView.frame = self.containerView.bounds;
[self.containerView addSubview:self.nativeAd.mediaView];
self.nativeAd.mediaView.mediaViewDelegate = self;
[self.nativeAd playMediaView];
}
● 広告の再読込み:既存の広告のViewをメモリから解除
@interface ViewController()<ADFmyNativeDelegate>
@property (nonatomic) ADFNativeAd *nativeAd;
@property (nonatomic) ADFNativeAdInfo *nativeAdInfo;
@end
@implementation ViewController
- (void)reloadNativeAd {
if (self.nativeAdInfo) {
[self.nativeAdInfo.mediaView removeFromSuperView];
self.nativeAdInfo.mediaView = nil;
self.nativeAdInfo = nil;
[self.nativeAd loadAndNotifyTo:self];
}
}
● 広告の自動Refresh
一定時間後に新しい広告を表示するためにはアプリケーションでの実装が必要です。
実装方法はアプリケーションによって違うと思いますが、当マニュアルとSampleではTimerを使う方法について説明します。
@interface BannerAdInfoViewController ()<ADFmyNativeAdDelegate>
@property (nonatomic) ADFmyBanner *bannerAd;
@property (nonatomic) ADFNativeAdInfo *bannerAdInfo;
@property (nonatomic) ADFNativeAdInfo *oldBannerAdInfo;
@property (nonatomic) NSTimer *refreshTimer;
@end
- (void)refreshBanner {
[self releaseOldBannerInfo];
self.oldBannerAdInfo = self.bannerAdInfo;
}
- (void)releaseOldBannerInfo {
if (self.oldBannerAdInfo) {
[self.oldBannerAdInfo.mediaView removeFromSuperview];
self.oldBannerAdInfo.mediaView = nil;
self.oldBannerAdInfo = nil;
}
}
- (void)releaseBannerInfo {
if (self.bannerAdInfo) {
[self.bannerAdInfo.mediaView removeFromSuperview];
self.bannerAdInfo.mediaView = nil;
self.bannerAdInfo = nil;
}
}
- (IBAction)refreshChanged:(id)sender {
if (self.refreshSwitch.isOn && self.refreshTimer == nil) {
__weak BannerAdInfoViewController *weakSelf = self;
self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 repeats:true block:^(NSTimer * _Nonnull timer) {
[weakSelf refreshBanner];
[weakSelf.bannerAd loadAndNotifyTo:weakSelf]; // * 再度広告読み込み実施
}];
[self.refreshTimer fire];
} else if (!self.refreshSwitch.isOn && self.refreshTimer) {
[self.refreshTimer invalidate];
self.refreshTimer = nil;
}
}
1回目の広告を表示して一定時間が過ぎた後Timerを使って再度広告読み込みをします。
ただし、現在表示中の広告情報は変数の保存しておきます。
- (IBAction)showBannerAd:(id)sender {
//バナー広告チェック
if (self.bannerAdInfo.mediaView != nil) {
self.bannerAdInfo.mediaView.frame = self.containerView.bounds;
[self.containerView addSubview:self.bannerAdInfo.mediaView];
[self.bannerAdInfo playMediaView];
[self releaseOldBannerInfo]; // * 旧広告Viewを破壊する
} else {
NSLog(@"バナー広告準備できてない");
self.showButton.enabled = NO;
self.loadButton.enabled = YES;
}
}
- (void)onNativeAdLoadFinish:(nonnull ADFNativeAdInfo *)info appID:(nonnull NSString *)appID {
self.bannerAdInfo = info;
self.showButton.enabled = YES;
if (self.refreshSwitch.isOn) {
[self showBannerAd:nil]; // * 広告を表示する
}
}
広告読み込みが完了すると、最新の広告Viewを表示した後、旧広告Viewを破壊します。
1回目の広告Loading
↓
1回目の広告表示
↓
一定時間後2回目の広告Loading
↓
2回目の広告表示
↓
1回目の広告削除
↓
一定時間後3回目の広告Loading
↓
...
● 広告View以外の画面でもClickできるようにする
広告が表示されるADFMediaView以外でも、アプリで作成したテキスト、ボタンなどのViewに対してもClickした時に広告へ遷移させることが出来ます。
func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
titleLabel.text = info.title
info.registerInteractionViews([titleLabel])
}
上記のようにADFMovieNativeAdInfo (又はADFNativeAdInfo)のregisterInterationViews()関数を呼び出すことで、アプリケーションで作成したUIViewでもClickして遷移するような設定ができます。
実装の際の注意点
広告の読み込みに関して
初回の広告の読み込みには時間がかかりますので、アプリ起動時(AppDelegateのdidFinishLaunchingWithOptions:
など)に事前にinitializeWithAppID:
を呼び出して広告の設定情報をあらかじめ取得しておくと、広告を表示したい画面でloadAndNotifyTo:
を呼び出す際に広告の読み込みがスムーズになります。
サイズ目安について
広告の視認性確保のため、以下を目安に実装をお願いします。
- 縦画面: 動画広告の横幅が画面横幅の50%以上であること
- 横画面: 動画広告の横幅が画面横幅の25%以上であること
※上記基準を下回る場合は、広告の配信が停止される可能性がございますので、ご了承ください。
案件更新について
- 別の広告を表示するには、新たに
広告をリクエスト(loadAndNotifyTo)
する必要があります。 - ページを切り替えるタイミングで
loadAndNotifyTo
を呼び出すことをおすすめします。
1画面で広告を再読込みする場合
1画面で広告表示後、再度Loadをして違う広告を表示するときには既存の動画広告表示用のViewをメモリから解除する必要があります。 詳しい内容は実装例を参考してください。