May 20, 2016 · iOS objC

iOSアプリで複数の広告SDKを管理画面から切り替え可能にするクラス設計(バナー,レクタングル広告)

概要

iOSアプリで複数の広告SDKをサーバー経由で表示の切り替えを行った際のメモ

対象はバナー広告、レクタングル広告

やりたいこと

対象の広告プラットフォーム

バナー広告とレクタングル広告について

あまり馴染みのないレクタングル広告だったが各SDKともに呼び出し方法はバナー広告と同じで、表示サイズを変えてやればよいだけの実装が多かった

※インタースティシャル、ネイティブはまた別記事にて

サーバー側 広告APIの設計

アプリ側で表示の切り分け・広告の切り分けを行なうためのAPI

レスポンス

レスポンス等の情報は以下リンク先を参照

http://docs.sample321.apiary.io/#reference/0/ads/ads

apiary.ioで実験的に作成

モックAPI

以下のURLでAPIレスポンスの確認可能

レスポンスの ads は、広告位置に対応するキー名と設定値のペアリスト(Object)とする

http://private-f6b85-sample321.apiary-mock.com/ads

アプリ側設計

Model

広告APIのレスポンスに対応するモデルクラス

どの広告SDKを指定しているか判定するインスタンスメソッドを持つ

AdConfig

@property (nonatomic, readonly) BOOL isVisible;
@property (nonatomic, readonly, nonnull ) NSString* ssp;
@property (nonatomic, readonly, nonnull) NSString* mediaID;

- (BOOL)isSSPTypeFluct;
- (BOOL)isSSPTypeAdstir;
- (BOOL)isSSPTypeAmoad;
- (BOOL)isSSPTypeAdcrops;
- (BOOL)isSSPTypeAdgeneration;

Manager

シングルトンのマネージャークラス

パースしたモデルを [{広告位置のキー:ModelObject},{広告位置のキー:ModelObject}...]として保持(private)

広告位置キーを指定してキーが有効かどうかの確認、保持しているモデルクラスを供給するインスタンスメソッドを持つ

AdConfigManager

// インスタンス取得
+ (nonnull instancetype)defaultManager;

// 初期化
- (void)initializeWithJson:(nullable NSDictionary<NSString*,NSDictionary*>*)json;

// キーを指定してAdConfigを取得
- (nullable AdConfig*)configForKey:(nonnull NSString*)key;

// キーを指定して表示有無の確認
- (BOOL)isVisibleForAdKey:(nonnull NSString*)key;

// 広告情報の再読み込みを行う必要があるかどうか
- (BOOL)needReloadAds;

View

バナー広告、レクタングル広告を表示するためのViewクラス

コードもしくはnibから初期化を行うインスタンスメソッドを持つ

広告のサイズを返すクラスメソッドを持つ

configureWithConfigメソッドでは引数のAdConfig.ssp の中身を確認してどの広告プラットフォームかを判断。それぞれのSDKで実装されている広告描画処理を呼び出して表示を行う

AdView

// 広告の設定を指定して、初期化
- (instancetype __nullable)initWithFrame:(CGRect)frame config:(AdConfig* __nonnull)config;

// 広告の設定を行う
- (void)configureWithConfig:(AdConfig* __nonnull)config;

// バナー広告のサイズ
+ (CGSize)sizeForMobileBannerAd;

// レクタングル広告のサイズ
+ (CGSize)sizeForRectangleAd;

ユースケース

ある画面の下部にバナー広告を表示するには以下の流れで実装する

起動時に広告情報取得APIを叩いてAdConfigManagerで保持
↓
ViewControllerのxibの表示したい箇所に AdViewのIBOutletを配置  
↓
viewDidLoadあたりでキーを指定してAdConfigManagerからAdConfigを取得  
↓
取得したAdConfigを OutletのAdView#configureWithConfigに渡して広告描画処理呼び出し

まとめと所感

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket