インフィード広告実装方法 - glossom-dev/AdfurikunSDK-iOS GitHub Wiki

インフィード広告 実装方法

はじまる前に

インフィード広告のタイプによって使われるObject名、Delegate名が違うだけで全体的な実装方法は同じですので、次のテーブルを参考にして差し替えて実装してください。

広告種類 Class名 Delegate名 広告情報Class名
ネイティブ ADFmyNativeAd ADFmyNativeAdDelegate ADFNativeAdInfo
モバイルバナー ADFmyBanner ADFmyNativeAdDelegate ADFNativeAdInfo
レクタングル ADFmyRectangle ADFmyNativeAdDelegate ADFNativeAdInfo

アドフリくんSDKのインポート

Swift
import ADFMovieReward
Objective-C
#import <ADFMovieReward/ADFmyNativeAd>

インフィード広告の初期化、ロード

ADFmyNativeクラスのcreateInstance:メソッドを呼び出して初期化を行います。
“アドフリくん管理画面で発行された広告枠 ID” を引数に指定して下さい。
loadAndNotify:メソッドを呼び出してロードを開始します。

Swift
class ViewController: UIViewController {

    private var nativeAd: ADFmyNativeAd?

    override func viewDidLoad() {
        super.viewDidLoad()

        nativeAd = ADFmyNativeAd.createInstance(広告枠ID)
        nativeAd.loadAndNotify(to: self)
    }
}

extension ViewController: ADFmyNativeAdDelegate {
    func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
        //広告ロード成功
    }

    func onNativeAdLoadError(_ error: ADFMovieError, appID: String, adnetworkError: [AdnetworkError]) {
        //広告ロード失敗
    }
}
Objective-C
@interface ViewController () <ADFmyNativeAdDelegate>
@property (nonatomic) ADFmyNativeAd *nativeAd;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.nativeAd = [ADFmyNativeAd createInstance:広告枠ID];
    [self.nativeAd loadAndNotifyTo:self];
}

- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID {
    //広告ロード成功
}

- (void)onNativeAdLoadError:(ADFMovieError *)error appID:(NSString *)appID adnetworkError:(NSArray<AdnetworkError *> *)adnetworkError {
    //広告ロード失敗
}

@end

インフィード広告の表示

デリゲートで広告ロード成功通知を受け取った後、引数のinfoオブジェクトのmediaViewを表示させ、infoのplayMediaViewメソッドを呼び出して下さい。 広告種類で取得できる広告情報についてはこちらの手順を参考してください。

Swift
func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
    if let mediaView = info.mediaView {
        mediaView.frame = adView.bounds
        adView.addSubview(mediaView)
        info.playMediaView()
    }
}
Objective-C
- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID {
    if (info.mediaView) {
        info.mediaView.frame = self.adView.bounds
        [self.adView addSubView:info.mediaView];
        [info playMediaView];
    }
}

デリゲートメソッドを実装する

Swift

インフィード広告のロードコールバックデリゲート

extension ViewController: ADFmyNativeAdDelegate {
    func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
        //広告ロード成功
    }

    func onNativeAdLoadError(_ error: ADFMovieError, appID: String, adnetworkError: [AdnetworkError]) {
        //広告ロード失敗
    }
}

インフィード広告のイベント

extension ViewController: ADFMediaViewDelegate {
    func onADFMediaViewPlayStart() {
        //広告再生時に呼ばれます
    }

    func onADFMediaViewPlayFinish() {
        //広告再生完了時に呼ばれます
    }

    func onADFMediaViewClick() {
        //広告クリック時に呼ばれます
    }

    func onADFMediaViewPlayFail() {
        //広告再生失敗時に呼ばれます
    }
}
Objective-C

インフィード広告のロードコールバックデリゲート

@interface ViewController () <ADFmyNativeAdDelegate>
@end

@implementation ViewController
- (void)onNativeAdLoadFinish:(ADFNativeAdInfo *)info appID:(NSString *)appID {
    //広告ロード成功
}

- (void)onNativeAdLoadError:(ADFMovieError *)error appID:(NSString *)appID adnetworkError:(NSArray<AdnetworkError *> *)adnetworkError {
    //広告ロード失敗
}
@end

インフィード広告のイベント

@interface ViewController () <ADFmyNativeAdDelegate, ADFMediaViewDelegate>
@end

@implementation ViewController
- (void)onADFMediaViewPlayStart {
    //広告再生時に呼ばれます
}

- (void)onADFMediaViewPlayFinish {
    //広告再生完了時に呼ばれます
}

- (void)onADFMediaViewClick {
    //広告クリック時に呼ばれます
}

- (void)onADFMediaViewPlayFail {
    //広告再生失敗時に呼ばれます
}
@end

ネイティブ広告の実装ガイドライン

サイズ目安について

広告の視認性確保のため、以下を目安に実装をお願いします。

  • 縦画面: 動画広告の横幅が画面横幅の50%以上であること
  • 横画面: 動画広告の横幅が画面横幅の25%以上であること

※上記基準を下回る場合は、広告の配信が停止される可能性がございますので、ご了承ください。

動画案件更新について

  • 別の広告動画を表示するには、新たに動画nativeをリクエスト(loadAndNotifyTo)する必要があります。
  • ページを切り替えるタイミングでloadAndNotifyToを呼び出すことをおすすめします。

スポンサー表記について

広告であるということを必ず明記してください。 以下の例を参考の上記載をお願いいたします。

例:「PR」「スポンサー広告」「Sponsored」「広告」「AD」

NativePR

ネイティブ広告を組み立てる

広告情報取得

広告種類によって、広告情報Class(ADFNativeAdInfo)から取得できる広告情報が決まっています。

Property 変数タイプ モバイルバナー レクタングル ネイティブ広告 説明
adnetworkKey NSString アドネットワークキー
mediaType enum ADFNativeAdType 広告タイプ
ADFNativeAdType_Movie, ADFNativeAdType_Image
title NSString 広告タイトル
下記のアドネットワークでサポート可能
Nend
AfiO
AdMob
Pangle
desc NSString 広告説明文
下記のアドネットワークでサポート可能
Nend
AfiO
Pangle
mediaView ADFMediaView 広告画面
isCustomComponentSupported BOOL 広告パーツサポート可否
下記のアドネットワークでサポート可能
AdMob

広告の組み立て

ADFNativeAdInfoisCustomComponentSupportedがTrueの場合、広告は画面だけではなくて、UIを組み立てるパーツも提供します。
getCustomNativeAdComponentsメソッドを使って、ADNW毎に公開されているUIパーツを取得して、アプリケーションのUIに合わせて組み立てることが出来ます。

提供するパーツはアドネットワークごとに違いますので、詳細内容については、
Swiftは、SwiftSampleプロジェクトのNativeCustomComponentsViewController.swiftファイルを、 Objective-Cの場合は、ObjCSampleプロジェクトのNativeCustomComponentsViewController.mファイルを参考にしてください。

広告View以外の画面でもClickできるようにする

広告が表示されるADFMediaView以外でも、アプリで作成したテキスト、ボタンなどのViewに対してもClickした時に広告へ遷移させることが出来ます。

func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
	titleLabel.text = info.title
	info.registerInteractionViews([titleLabel])
}

上記のようにADFMovieNativeAdInfo (又はADFNativeAdInfo)のregisterInterationViews()関数を呼び出すことで、アプリケーションで作成したUIViewでもClickして遷移するような設定ができます。

広告の自動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
↓
...
⚠️ **GitHub.com Fallback** ⚠️