インフィード広告実装方法 - glossom-dev/AdfurikunSDK-iOS GitHub Wiki
インフィード広告のタイプによって使われるObject名、Delegate名が違うだけで全体的な実装方法は同じですので、次のテーブルを参考にして差し替えて実装してください。
広告種類 | Class名 | Delegate名 | 広告情報Class名 |
---|---|---|---|
ネイティブ | ADFmyNativeAd | ADFmyNativeAdDelegate | ADFNativeAdInfo |
モバイルバナー | ADFmyBanner | ADFmyNativeAdDelegate | ADFNativeAdInfo |
レクタングル | ADFmyRectangle | ADFmyNativeAdDelegate | ADFNativeAdInfo |
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」
広告種類によって、広告情報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 |
ADFNativeAdInfo
のisCustomComponentSupported
がTrueの場合、広告は画面だけではなくて、UIを組み立てるパーツも提供します。
getCustomNativeAdComponents
メソッドを使って、ADNW毎に公開されているUIパーツを取得して、アプリケーションのUIに合わせて組み立てることが出来ます。
提供するパーツはアドネットワークごとに違いますので、詳細内容については、
Swiftは、SwiftSample
プロジェクトのNativeCustomComponentsViewController.swift
ファイルを、
Objective-Cの場合は、ObjCSample
プロジェクトのNativeCustomComponentsViewController.m
ファイルを参考にしてください。
広告が表示されるADFMediaView以外でも、アプリで作成したテキスト、ボタンなどのViewに対してもClickした時に広告へ遷移させることが出来ます。
func onNativeAdLoadFinish(_ info: ADFNativeAdInfo, appID: String) {
titleLabel.text = info.title
info.registerInteractionViews([titleLabel])
}
上記のようにADFMovieNativeAdInfo (又はADFNativeAdInfo)のregisterInterationViews()関数を呼び出すことで、アプリケーションで作成したUIViewでもClickして遷移するような設定ができます。
一定時間後に新しい広告を表示するためにはアプリケーションでの実装が必要です。
実装方法はアプリケーションによって違うと思いますが、当マニュアルと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
↓
...