GoogleのAdMob広告にはバナー広告、インターステーシャルがありますが、動画リワード広告もできます。その実装方法についての覚書です。
Xcode 10.2.1
Rewarded Video Ads
Googleの動画リワード広告についての公式ページは、動画リワード広告の概要 あるいは 新たなマネタイゼーション改革でビジネスの「レベルアップ」を にあります。
実装としては、AdMobの解説 Rewarded Video Ads を元に進めます。
Firebaseの設定
広告の設定には昔からのGoogle Mobile Ads SDKをインストールする方法と、Firebaseを使う方法があります。ここではFirebaseでの方法でリワード広告を実装してみます。
基本的な設定は以下をを参照してください。
- GoogleService-Info.plistを取得
- Firebase Consoleに入ってファイルをゲットする
- CocoaPodsのインストールと設定
- Xcodeへの記述
- 初期化はAppDelegateに実装する
- Info.plistの設定
- 動画リワード広告の設定については別になります
動画リワード広告の設定
以降はテストの確認を想定して設定していきます。(本番はIDを変えます)
ViewController.swift にGoogleMobileAdsのインポートとGADRewardBasedVideoAdDelegateの設定をします
1 2 3 4 |
import GoogleMobileAds //ViewController.swift class ViewController: UIViewController, GADRewardBasedVideoAdDelegate { |
GADRewardBasedVideoAdDelegateのイベントの情報を取得するために以下を追加
1 2 3 4 5 |
func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) { // print("Reward received with currency: \(reward.type), amount \(reward.amount).") } |
テスト用のwithAdUnitIDを入れ、広告のロードをリクエストします。
1 2 3 |
GADRewardBasedVideoAd.sharedInstance().delegate = self GADRewardBasedVideoAd.sharedInstance().load(GADRequest(), withAdUnitID: "ca-app-pub-3940256099942544/1712485313") |
ロードが完了したら、広告を表示させます。
.isReadyを使って準備ができているか確認できます。
1 2 3 |
if GADRewardBasedVideoAd.sharedInstance().isReady == true { GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self) } |
コーディングまとめ
ステータスを確認して、ボタンのタイミングでリワード広告を表示させてみます。
Firebaseの初期設定としてAppDelegateに以下の記述をします。
AppDelegate.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import UIKit import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { GADMobileAds.sharedInstance().start(completionHandler: nil) return true } ... } |
広告のダウンロードのタイミングはネット通信状況等でフレキシブルに対応しないといけません。また .isReadyで準備できたかはわかりますが、
rewardBasedVideoAdDidReceive(_ rewardBasedVideoAd: GADRewardBasedVideoAd)
を使うとロード完了したタイミングがわかります。
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import UIKit import GoogleMobileAds class ViewController: UIViewController, GADRewardBasedVideoAdDelegate { let AdMobID = "[Your AdMob ID]" let TEST_ID = "ca-app-pub-3940256099942544/1712485313" var AdUnitID:String? = nil let simulation = true /// Is an ad being loaded. var adRequestInProgress = false var adRedy = false /// The reward-based video ad. var rewardBasedVideo: GADRewardBasedVideoAd? @IBOutlet weak var statusLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() if simulation { AdUnitID = TEST_ID } else{ AdUnitID = AdMobID } rewardBasedVideo = GADRewardBasedVideoAd.sharedInstance() rewardBasedVideo?.delegate = self setupRewardBasedVideoAd() } func setupRewardBasedVideoAd(){ statusLabel.text = "set up" if !adRequestInProgress && rewardBasedVideo?.isReady == false { rewardBasedVideo?.load(GADRequest(), withAdUnitID: AdUnitID! ) adRequestInProgress = true } else{ print("Error: setup RewardBasedVideoAd") } } @IBAction func playAd(_ sender: Any) { print("adRedy=\(adRedy)") if GADRewardBasedVideoAd.sharedInstance().isReady && adRedy{ GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self) adRedy = false } else{ print("Error: Reward based video not ready") } } // MARK: GADRewardBasedVideoAdDelegate implementation func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didFailToLoadWithError error: Error) { adRequestInProgress = false statusLabel.text = "failed to load" print("Reward based video ad failed to load: \(error.localizedDescription)") } func rewardBasedVideoAdDidReceive(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { statusLabel.text = "ad is received" adRequestInProgress = false adRedy = true print("Reward based video ad is received.") } func rewardBasedVideoAdDidOpen(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { statusLabel.text = "Opened reward based video ad." print("Opened reward based video ad.") } func rewardBasedVideoAdDidStartPlaying(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { print("started playing.") } func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { statusLabel.text = "ad is closed" setupRewardBasedVideoAd() print("Reward based video ad is closed.") } func rewardBasedVideoAdWillLeaveApplication(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { print("Reward based video ad will leave application.") } func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) { print("Reward received with currency: \(reward.type), amount \(reward.amount).") } } |
サンプル動画
この後、ストーリーボードでラベルとボタンを作ってコードと紐付けすれば出来上がりです。
尚、広告をクローズしたところで再度設定し直していますが、これを入れないとユーザーが最後まで見ずに終わった場合、再起動するまでこの広告を再開できないためです
1 2 3 4 5 6 |
func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { statusLabel.text = "ad is closed" setupRewardBasedVideoAd() print("Reward based video ad is closed.") } |
ユーザーが見たくないのに何度も見せることで評価を下げたくない場合はやめたほうがいいのかもしれません。サンプルコードには入っていませんし
因みにテスト用の動画は何種類もあります。
関連ページ:
- Firebase
- AdMob bannerを実装(Firebase)
- AdMobの動画リワード広告
- Google Mobile Ads SDK
References:
Rewarded Video Ads | AdMob for iOS | Google Developers
動画リワード広告の概要
新たなマネタイゼーション改革でビジネスの「レベルアップ」を