iOSアプリに動画リワードを表示するためにAdstirを導入したのでメモ。
※できるだけ本家を参考にしましょう。この情報は最新で無い可能性があります。
【united-adstir/AdStir-Integration-Guide-iOS: AdStir Integration Guide for iOS App】
https://github.com/united-adstir/AdStir-Integration-Guide-iOS
環境
Swift 4
Xcode 9.2
Adstir 2.11.2
ライブラリ導入
AdstirはPodで導入する方法と、手動で導入する方法があります。
基本はPodで入れたほうがいいかと思います。
特にAdstirは個別の動画広告SDKもPod経由で導入できるので、全部Podで入れるのをおすすめします。
以下は例です。全ての動画リワード用のSDKを一気に導入したり、下記のように個別に指定もできます。
def default_install_pods
pod 'AdStir-Ads-SDK'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/AdCorsa', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/Maio', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/Nend', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/UnityAds', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/Vungle', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
pod 'AdStir-Ads-SDK-VideoAdSDKBundled/Mobvista', :path => 'AdstirAdsSdkiOS-2.11.2-VideoAdSDKBundled'
end
target 'TargetName' do
default_install_pods
end
そして、プロジェクトルート直下にAdstirからDLしてきたAdstirAdsSdkiOS-2.11.2-VideoAdSDKBundledディレクトリをコピーします。(このディレクトリ名とPodfileの :path => 'ここを同じ名前にする')
そして、導入するライブラリ名のディレクトリとAdStir-Ads-SDK-VideoAdSDKBundled.podspec
を残して、他は消します(いらないので)
参考:
【CocoaPodsを利用した組み込み · united-adstir/AdStir-Integration-Guide-iOS Wiki】
https://github.com/united-adstir/AdStir-Integration-Guide-iOS/wiki/CocoaPods%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF
【CocoaPodsを利用した動画SDKの組み込み · united-adstir/AdStir-Integration-Guide-iOS Wiki】
https://github.com/united-adstir/AdStir-Integration-Guide-iOS/wiki/CocoaPods%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E5%8B%95%E7%94%BBSDK%E3%81%AE%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF
初期設定
// 引数にはユーザーを判別できる一意なID的なものを指定するといいです。
AdstirVideoAds.setMediaUserID(UIDevice.currentDevice().identifierForVendor?.UUIDString)
// AdstirVideoAds.prepareは同じIDを指定して叩きまくってもCrashはしなかったです。
// なので、AppDelegateではなく、それぞれ動画リワードを表示するところで叩いても大丈夫そうです。
AdstirVideoAds.prepare(withMedia:"メディアID", spots: [枠No, 枠No])
実装
import UIKit
import AdstirAds
class ViewController: UIViewController {
@IBOutlet weak var statusLabel: UILabel!
@IBOutlet weak var showVideoButton: UIButton!
// リワード広告を表示するボタンのターゲットメソッド
// ボタンをタップして、広告準備が終わっていなかったら終わるまでループしてまちます
// なのでボタンが複数回押されないようになんかしらしてください
@IBAction func showVideoButtonTouchUpInside(sender: AnyObject) {
if self.didLoadMovieReward {
self.videoReward?.show(from: self)
} else {
// 広告の準備が終わっていなかったら1秒待ちます
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.playMovieRewardIfReady()
}
}
}
private var videoReward: AdstirVideoReward?
private var didLoadMovieReward = false
override func viewDidLoad() {
super.viewDidLoad()
// AdstirVideoRewardの表示準備をします。
let videoReward = AdstirVideoReward(media: "メディアID", spot: 枠No)
videoReward?.delegate = self
self.videoReward = videoReward
self.videoReward?.load()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
deinit {
// 後処理です。呼ばないとメモリリークとかするんじゃないかな
self.videoReward?.delegate = nil;
self.videoReward = nil;
}
}
extension ViewController: AdstirVideoRewardDelegate {
// 動画の読み込み完了イベントを受け取ります
func adstirVideoRewardDidLoad(videoReward: AdstirVideoReward!) {
self.didLoadMovieReward = true
}
// 動画の再生準備に失敗した際に呼び出されます
func adstirVideoReward(videoReward: AdstirVideoReward!, didFailToLoadWithError error: NSError!) {
self.didLoadMovieReward = true
}
// 動画の再生に失敗した際に呼び出されます
func adstirVideoReward(_ videoReward: AdstirVideoReward, didFailToPlaybackWithError error: Error) {
// loadはできたけどshowに失敗した場合
// 再度Showを叩いてみたりしてもだめだったら一旦諦めたほうがいいかも
}
// 動画のインセンティブ付与の完了イベントを受け取ります
func adstirVideoRewardDidComplete(videoReward: AdstirVideoReward!) {
// 再生完了!
}
// 動画画面を閉じた時に呼ばれます
func adstirVideoRewardDidClose(videoReward: AdstirVideoReward!) {
// 動画リワードを閉じます
}
}
注意点
- 動画リワードのViewはpresentされて出てくるので、他にprsentしている要素があると競合して表示されないことがあります。
まとめ
後は各々の仕様にあわせて良い感じに実装してください