iOSアプリで複数の広告SDKを管理画面から切り替え可能にするクラス設計(バナー,レクタングル広告)
概要
iOSアプリで複数の広告SDKをサーバー経由で表示の切り替えを行った際のメモ
対象はバナー広告、レクタングル広告
やりたいこと
- 複数の広告プラットフォームを表示したい
- 管理画面から表示している広告プラットフォームを切り替えたい
対象の広告プラットフォーム
バナー広告とレクタングル広告について
- バナー広告 => サイズが
端末横幅 * 大体44?
のよくあるモバイル向け広告 - レクタングル広告 => その名の通り正方形サイズの広告。
あまり馴染みのないレクタングル広告だったが各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に渡して広告描画処理呼び出し
まとめと所感
- クラス設計とはいいつつ、バナー広告とレクタングル広告についてはシングルトンのマネージャークラスでデータを保持するだけ。
- インタースティシャル、ネイティブ広告でこのマネージャークラス等を拡張しているのでそちらは後日まとめる。
- 広告SDKはまだまだSwift対応できているところが少ない。