InMobiネイティブ広告は、アプリのコンテンツにシームレスに調和することによって、ユーザーにより良い印象や体験を提供できます。アプリのデザインに最も合うレイアウトを選択し、カスタマイズすることができます。ニュース、ユーティリティー、コミュニケーション系のアプリにとっては理想的な広告フォーマットです。
InMobiネイティブ広告は、動画、静止イメージのどちらにも対応できます。プレースメントに応じて以下の選択が可能です。
以下の手順に従い、ネイティブ広告での収益化を開始してください。
インフィード動画広告プレースメント
静的フィード広告プレースメント
-(UIView*)primaryViewOfWidth:(CGFloat)width <br>
を確認してください。 primaryViewの取得時にwidth = 25を指定します。AdChoicesアイコンが表示され、広告レンダリングイベントが発生します。
スプラッシュ動画広告プレースメント
SPLASH(スプラッシュ)をネイティブ広告レイアウトとして選択します。
IMNativeクラスには、次のオブジェクトが含まれています。
NSString* adTitle
- 広告のタイトルを返します。NSString* adDescription
- 広告の説明を返します。UIImage* adIcon
- 広告のアイコンイメージを返します。NSString* adCtaText
- 広告のClick to actionテキストを返します。NSString* adRating
- 広告の評価を返します(オプション)。NSURL* adLandingPageUrl
- 広告のランディングURLを返します。BOOL isAppDownload
- 広告がアプリをダウンロードするかどうかを返します。NSString* customAdContent
- これには、広告のプライマリビューの周囲にカスタムUIを作成する際に使用できる追加情報(説明、イメージURLなど)が含まれています。IMNativeクラスは、次の機能をサポートしています。
-(UIView*)primaryViewOfWidth:(CGFloat)width
- 指定された幅のUIViewを返します。これはネイティブ広告のメインの広告コンテンツです。ネイティブプレースメントの作成時にInMobiダッシュボードで選択したのと同じアスペクト比のビューを返します。このプライマリビューが画面に表示されると、すべてのインプレッションレンダリングイベントも自動的に発生します。
プレースメントの作成中にフィードレイアウトを選択した場合は、primaryViewの取得時にwidth = 25を指定します。AdChoicesアイコンが表示され、広告レンダリングイベントが発生します。
-(void)load
- 広告をメモリに読み込む機能-(BOOL)isReady
- Trueは、広告を表示する準備が完了していることを意味します。-(void)reportAdClickAndOpenLandingPage
- この関数はクリックイベントを発生させ、ランディングページを開きます。この関数の使用中はランディングページを自分で開く必要はありません。-(void)recyclePrimaryView
- 広告が画面上の可視領域から外れるたびにこの関数を呼び出します。また、同じオブジェクトにネイティブ広告を再度読み込む前にこれを呼び出します。InMobi SDKヘッダーをインポートします。
#import <InMobiSDK/InMobiSDK.h>
広告を表示する際のフィード内の位置を宣言します。例は、4番目の位置に広告を表示する場合です。
#define IM_AD_INSERTION_POSITION 4
以下でネイティブ広告インスタンスを宣言します。 ViewController.m
@interface TableViewController () <IMNativeDelegate>
@property(nonatomic,strong) IMNative *InMobiNativeAd;
@end
最終的なViewDidLoad
コードは次のようになります。
- (void)viewDidLoad {
[super viewDidLoad];
self.InMobiNativeAd = [[IMNative alloc] initWithPlacementId:<Insert InMobi
placement ID here>];
self.InMobiNativeAd.delegate = self;
[self.InMobiNativeAd load];
//Your app content
}
コールバックに成功するためにIMNativeDelegate
メソッドを実装します。コールバックに成功すると、広告を画面上に表示する準備が整ったことを表示します。ここでは、InMobiNativeAdオブジェクトをTableViewのデータソースに追加する必要があります。
-(void)nativeDidFinishLoading:(IMNative*)native{
[self.tableData insertObject:native atIndex:IM_AD_INSERTION_POSITION];
[self.tableView reloadData];
NSLog(@"Native Ad did finish loading");
}
nativeAdDidFinishLoading
のコールバックを取得すると、ネイティブ広告を正常に受信したことになります。次の例は、adViewをtableViewデリゲートcellForRowAtIndexPath
にフェッチする方法を示しています。
注意:インプレッションイベントは、ネイティブ広告のプライマリビューが画面の表示領域にある場合にのみ発生します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
InFeedTableCell *cell = (InFeedTableCell *)[tableView
dequeueReusableCellWithIdentifier:@"InFeedTableCell"];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InFeedTableCell"
owner:self options:nil];
cell = [nib objectAtIndex:0];
id slide = [self.tableData objectAtIndex:indexPath.row];
if ([self isAdAtIndexPath:indexPath]) {
IMNative * currentNativeAd = slide;
cell.iconImageView.image = currentNativeAd.adIcon;
cell.titleLabel.text = currentNativeAd.adTitle;
cell.subTitleLabel.text = @"Sponsored";
cell.descriptionLabel.text = currentNativeAd.adDescription;
cell.ctaLabel.text = currentNativeAd.adCtaText;
//Calculate your feed's primaryImageViewWidth and use it to fetch and
Ad Primary view of same width.
UIView* AdPrimaryViewOfCorrectWidth = [currentNativeAd
primaryViewOfWidth:primaryImageViewWidth];
//Set the frame of Ad Primary View same as that of your feed's Primary
View
AdPrimaryViewOfCorrectWidth.frame = primaryImageViewFrame;
[cell addSubview:AdPrimaryViewOfCorrectWidth];
UITapGestureRecognizer *singleTapAndOpenLandingPage =
[[UITapGestureRecognizer alloc] initWithTarget:currentNativeAd
action:@selector(reportAdClickAndOpenLandingPage)];
cell.ctaLabel.userInteractionEnabled = YES;
[cell.ctaLabel addGestureRecognizer:singleTapAndOpenLandingPage];
}
else{
//Your Appâ??s TableCell implementation
}
return cell;
}
広告が画面領域から外れるたびに、ネイティブ広告のプライマリビューをリサイクルする必要があります。これは、メモリ使用量を最適化し、AdViewがアプリのネイティブビューと競合しないようにするためです。広告が画面上の可視領域から外れるたびにInMobiNativeAd
オブジェクト上にrecyclePrimaryView
メソッドを呼び出します。TableViewでは、didEndDisplayingCell
メソッドでこれを呼び出すことができます。
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if([self isAdAtIndexPath:indexPath]){
[self.InMobiNativeAd recyclePrimaryView];
}
}
注意:recyclePrimaryView
を呼び出したあとで、画面上に再度ビューを追加する場合は、[self.InMobiNativeAd primaryViewOfWidth:<custom width>]
からビューを取得する必要があります。前のビューがリサイクルされてしまっているからです。これをcellForRowAtIndexPathデリゲートに追加した場合は(手順8を参照)、ここで何も行う必要はありません。
注意:IMNative
オブジェクトをtableData
から削除し、現在の広告オブジェクトを破棄することは重要なことです。次に、新しいオブジェクトを作成し、そのオブジェクトにloadを呼び出す必要があります。また、既存のオブジェクトを破棄する前にプライマリビューをリサイクルする必要があります。
-(void)refreshInMobiStrandAd {
[self.tableData removeObject:self.InMobiNativeAd];
[self.tableView reloadData];
[self.InMobiNativeAd recyclePrimaryView];
self.InMobiNativeAd = [[IMNative alloc] initWithPlacementId:<Insert InMobi
placement ID here>];
self.InMobiNativeAd.delegate = self;
[self.InMobiNativeAd load];
}
[self.InMobiNativeAd primaryViewOfWidth:<custom width>]
メソッドを再度呼び出して、現在の広告のプライマリビューを新しいビューに置き換える必要があります。ViewController
クラスのdealloc
メソッドで、InMobiNativeAd
オブジェクトとそのデリゲートをnilに設定する必要があります。割り当てを解除してadViewへの参照をすべて削除するには、ビューのリサイクルの確認後に行います。
-(void)dealloc {
[self.InMobiNativeAd recyclePrimaryView];
self.InMobiNativeAd.delegate = nil;
self.InMobiNativeAd = nil;
}
self.InMobiNativeAd.isReady
関数を使用して、広告の表示の準備が完了しているかどうかを判断する必要があります。メインスレッドが占有されていて、時間どおりにnativeDidFinishLoading
を受信できない場合もあります。このため、カットオフ時間が経過した直後に広告が準備完了になっているかどうかをプロアクティブにチェックするのが得策です。重要事項:広告の2番目の画面が表示されている場合は、広告を破棄しないでください。nativeWillPresentScreen
でこれをチェックし、このデリゲートが発生した場合は広告を閉じることはできません。サンプル実装を以下に示します。
@property(nonatomic,strong) bool *isSecondScreenDisplayed;// Use this to check if second screen has to be shown or not
-(void)nativeWillPresentScreen:(IMNative*)native{
NSLog(@"Native Ad will present screen");
isSecondScreenDisplayed = YES;
}
プライマリビューをリサイクルしてから、広告を破棄します。これは次のように実装できます。
@property (nonatomic, strong) UIView* SplashAdView; // Use this view to check for visibility of splash screen
-(void)dismissAd{
if(isSecondScreenDisplayed){
NSLog(@"DO NOT DISMISS THE AD WHILE THE SCREEN IS BEING DISPLAYED");
}
else{
self.SplashAdView.hidden = true;
[self.InMobiNativeAd recyclePrimaryView];
self.InMobiNativeAd = nil;
}
}
プレロール動画エクスペリエンスは、同じIMNativeクラスを使用して実装できます。以下のデリゲートで広告ビューを閉じる必要があります。
-(void)nativeDidFinishPlayingMedia:(IMNative *)native{
[self dismissAd];
}
プレロール広告は、以下のように閉じることができます。
@property (nonatomic, strong) UIView* PrerollAdView; //Use this to store the primaryView returned by the IMNative instance.
-(void)dismissAd{
self.PrerollAdView.hidden = true;
[self.InMobiNativeAd recyclePrimaryView];
self.InMobiNativeAd = nil;
}
以下の手順を実行して追加のコールバックを取得できます。お客様の ViewController.m
ファイルで以下のデリゲートメソッドを実装します。
/*Indicates that the naive has received the ad markup. */
- (void)nativeAdIsAvailable:(IMNative *)native {
NSLog(@"nativeAdIsAvailable");
}
-(void)nativeDidFinishLoading:(IMNative*)native{
NSLog(@"Native Ad load Successful"); // Ad is ready to be displayed
}
-(void)native:(IMNative*)native didFailToLoadWithError:(IMRequestStatus*)error{
NSLog(@"Native Ad load Failed"); // No Fill or error
}
-(void)nativeWillPresentScreen:(IMNative*)native{
NSLog(@"Native Ad will present screen"); //Full Screen experience is about to be presented
}
-(void)nativeDidPresentScreen:(IMNative*)native{
NSLog(@"Native Ad did present screen"); //Full Screen experience has been presented
}
-(void)nativeWillDismissScreen:(IMNative*)native{
NSLog(@"Native Ad will dismiss screen"); //Full Screen experience is going to be dismissed
}
-(void)nativeDidDismissScreen:(IMNative*)native{
NSLog(@"Native Ad did dismiss screen"); //Full Screen experience has been dismissed
}
-(void)userWillLeaveApplicationFromNative:(IMNative*)native{
NSLog(@"User leave"); //User is about to leave the app on clicking the ad
}
-(void)native:(IMNative *)native didInteractWithParams:(NSDictionary *)params{
NSLog(@"User clicked"); // Called when the user clicks on the ad.
}
-(void)nativeAdImpressed:(IMNative *)native{
NSLog(@"User viewed the ad"); // Called when impression event is fired.
}
-(void)nativeDidFinishPlayingMedia:(IMNative*)native{
NSLog(@"The Video has finished playing"); // Called when the video has finished playing. Used for preroll use-case
}
-(void)native:(IMNative *)native rewardActionCompletedWithRewards:(NSDictionary *)rewards{
NSLog(@"Rewarded"); // Called when the user is rewarded to watch the ad.
}
-(void)userDidSkipPlayingMediaFromNative:(IMNative*) native {
NSLog(@"User has skipped playing media"); // Called when the user has opted to skip the media being shown.
}
-(void)native:(IMNative*)native adAudioStateChanged:(BOOL)audioStateMuted {
if (audioStateMuted) {
NSLog(@"Inline video-ad audio state changed to mute");
} else {
NSLog(@"Inline video-ad audio state changed to unmute");
}
//This is called when inline video audio state changes.
}
InMobiのSDKは、ネイティブプレースメントに対してHTMLとネイティブユニットの両方を実行できます。ネイティブプレースメント用に予約されているリソースに応じて、以下の広告サイズを実行できます。
これをオンに切り替えるには、希望のバックフィルサイズでそれぞれのパートナーマネージャーに接触する必要があります。また、以下のようにコード内でこれを処理する必要があります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
InFeedTableCell *cell = (InFeedTableCell *)[tableView
dequeueReusableCellWithIdentifier:@"InFeedTableCell"];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InFeedTableCell"
owner:self options:nil];
cell = [nib objectAtIndex:0];
id slide = [self.tableData objectAtIndex:indexPath.row];
if ([self isAdAtIndexPath:indexPath]) {
if ([currentNativeAd.customAdContent rangeOfString:@"isHTMLResponse"].location != NSNotFound)
{
IMNative * currentNativeAd = slide;
//Depending on the selected backfill size, provide accurate width below
UIView* AdPrimaryViewOfCorrectWidth = [currentNativeAd primaryViewOfWidth:250];
AdPrimaryViewOfCorrectWidth.frame = primaryImageViewFrame;
[cell addSubview:AdPrimaryViewOfCorrectWidth];
}
else
{
IMNative * currentNativeAd = slide;
cell.iconImageView.image = currentNativeAd.adIcon;
cell.titleLabel.text = currentNativeAd.adTitle;
cell.subTitleLabel.text = @"Sponsored";
cell.descriptionLabel.text = currentNativeAd.adDescription;
cell.ctaLabel.text = currentNativeAd.adCtaText;
//Calculate your feed's primaryImageViewWidth and use it to fetch and Ad Primary view of same width.
UIView* AdPrimaryViewOfCorrectWidth = [currentNativeAd primaryViewOfWidth:primaryImageViewWidth];
//Set the frame of Ad Primary View same as that of your feed's Primary View
AdPrimaryViewOfCorrectWidth.frame = primaryImageViewFrame;
[cell addSubview:AdPrimaryViewOfCorrectWidth];
UITapGestureRecognizer *singleTapAndOpenLandingPage =
[[UITapGestureRecognizer alloc] initWithTarget:currentNativeAd
action:@selector(reportAdClickAndOpenLandingPage)];
cell.ctaLabel.userInteractionEnabled = YES;
[cell.ctaLabel addGestureRecognizer:singleTapAndOpenLandingPage];
}
}
else {
//Your Appâ??s TableCell implementation
}
return cell;
}
注意:
isHTMLResponse
が含まれます。時には、広告品質のチェックをすべて逃れた不正な広告主様が、無関係で不快なものや混乱するものをユーザーに表示することで、アプリのユーザーエクスペリエンスを損なうことになります。 このような状況への対応策として、広告インスタンスのcreativeIDを取得し、InMobiの連絡先に暗号化されたクcreativeIDでレポートし直します。
mNativeAd.creativeId // mNativeAd
はサンプルインスタンスです。
[ツール] - [診断]に進み、テストモードを グローバルオンかセレクティブオンのどちらかに切り替えます。
アプリに対する広告インテグレーションが初めての場合 | テストモードをグローバルオンに設定します。 |
特定のテスト用デバイスにのみテスト用広告を配信したい場合 アプリに対してSDKを実装済みで、特定の更新部分などのテストをテスト用のデバイスに限定して実施する必要がある場合。 |
テストモードをセレクティブオンに設定します。
デバイスセクションでテスト端末を登録します。
すでに登録済みのデバイスがある場合は、その端末を選択し、テストモードを有効に設定できます。 |
注意:テスト完了後、本番稼働する前にテストモードをオフにしなければなりません。そうしないと、お客様のアプリは収益化できません。
これで、テスト広告を取得するための準備が整いました。
デバイスIDの取得
ここでのデバイスIDは基本的にIDFAまたはIFA(広告の識別子)を指します。デバイスIDを取得するための、最も簡単なアプローチは、SDKのログレベルを「デバッグ」に設定することです。デバッグログを有効にするには、以下に示すように、これを AppDelegate.m
ファイル内のdidFinishLaunchingWithOptions
メソッドに追加することです。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Initialize InMobi SDK with your account ID
[IMSdk initWithAccountID:@"Insert InMobi account ID here"];
//Set log level to Debug
[IMSdk setLogLevel:kIMSDKLogLevelDebug];
// Do your stuff.
return YES;
}
デバッグモードでは、デバイスIDは以下の様にXCode開発者コンソールに出力されます。 â?œPublisher device ID is <device-id>â??
お客様はこのデバイスIDを デバイスIDボックスに入力できます。
[InMobi] アカウントIDで初期化されたInMobi SDK:<your account id here>
[InMobi] プレースメントIDのネイティブ広告を取得しています。<your placement id here>
[InMobi] パブリッシャーのデバイスIDは、<device id here>
です。
[InMobi] ネイティブ広告のプレースメントIDが正常に取得されました。<your placement id here>
** エラー ** [InMobi] ___ <ad format>
広告を作成する前にSDKを初期化
** エラー ** [InMobi] ___ アカウントIDはNULLでも空でもかまいません。有効なアカウントIDを入力してください。
[InMobi] initに渡されたアカウントIDが無効です。有効なアカウントIDを入力してください。
一般的なSDKの初期化メッセージ
ログレベル | シナリオ | 表示されるメッセージ |
エラー | SDKがインストールされていません。 | xxx広告を作成する前にSDKを初期化してください。 |
エラー | 広告サーバーURLのATS状態が無効です。 | ATS設定がサポートされていません。例外リストからInMobiを削除してください。 |
エラー | initializeSDKWithAccountIDに提供されたアカウントIDが空白またはNULLです。 | アカウントIDをNULLまたは空にすることはできません。有効なアカウントIDを入力してください。 |
デバッグ | 有効なアカウントIDを渡した場合。 | 以下のアカウントIDで初期化されたInMobi SDK:<Account-Id> |
デバッグ | アカウントIDの長さが無効な場合。 | initに渡されたアカウントIDが無効です。有効なアカウントIDを入力してください。 |
デバッグ | より新しいバージョンのSDKが入手可能な場合。 | InMobi SDKの新しいバージョン(ver.6.0.1)が利用可能です!現在は古い方のバージョンです(バージョン6.0.0)。最新のInMobi SDKを http://www.inmobi.com/products/sdk/#downloadsからダウンロードしてください。 |
広告のライフサイクルで出力される主なログ
ログレベル | シナリオ | 表示されるメッセージ |
エラー | 提供されたプレースメントIDが無効(<=0)です。 | 有効なプレースメントIDを入力してxx広告を作成してください。 |
エラー | 無効なバナープレースメントIDが呼び出されています。 | 読み込みを呼び出す前に有効なプレースメントIDを提供してください。 |
エラー | 広告の現在の状態は読み込み中または広告利用可能です。 | 広告の読み込みはすでに進行中です。別の広告をリクエストする前にその読み込みが完了するまでお待ちください。プレースメントID:xxが拒否されました。 |
エラー | 広告の現在の状態はアクティブです。 | 広告は現在ユーザーによって表示されています。別の広告をリクエストする前にそのユーザーが広告を閉じるまでお待ちくださいプレースメントID:xxが拒否されました。 |
エラー | 設定に示す最小更新インターバルになる前に広告が更新されています。 | 広告はxxx秒たつまで更新できません。 |
エラー | 広告の現在の状態は準備が整っていません。 | 広告の読み込みが完了していません。表示を呼び出す前に広告が準備完了状態になるのを待ってください |
エラー | 表示がインタースティシャル広告に呼び出されていますが、現在アプリはビューコントローラーを渡していません。 | ビューコントローラーなしでフルスクリーン広告を表示することはできません。フルスクリーン広告を表示するには、ビューコントローラーを渡してください。 |
エラー | 広告の現在の状態は添付されていない/レンダリングされていない、またはアクティブになっていない状態です。 | reportAdClickの呼び出しが間違った状態で作成されました。 |
デバッグ | デバイスID | パブリッシャーデバイスIDは<Device-ID> です。 |
デバッグ | 設定から収益化が無効になっている場合 | SDKはこの読み込み操作を実行しません。収益化が無効になっているからです。詳細な情報に関しては、InMobiまでご連絡ください。 |