iOS　Adstir(アドステア)導入　動画リワード編

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を一気に導入したり、下記のように個別に指定もできます。

```ruby:Podfile(例)
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`を残して、他は消します(いらないので)
<img width="621" alt="スクリーンショット 2018-02-26 17.57.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/a615ad1c-9d35-5f92-9951-d21c45c64702.png">


参考：
【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

# 初期設定

```swift:AppDelegate.swift
// 引数にはユーザーを判別できる一意なID的なものを指定するといいです。
AdstirVideoAds.setMediaUserID(UIDevice.currentDevice().identifierForVendor?.UUIDString)
// AdstirVideoAds.prepareは同じIDを指定して叩きまくってもCrashはしなかったです。
// なので、AppDelegateではなく、それぞれ動画リワードを表示するところで叩いても大丈夫そうです。 
AdstirVideoAds.prepare(withMedia:"メディアID", spots: [枠No, 枠No])
```

# 実装

```swift:ViewController.swift
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している要素があると競合して表示されないことがあります。

# まとめ

後は各々の仕様にあわせて良い感じに実装してください