【Swift UI】AdMobのリワード広告の実装方法!GADFullScreenContentDelegate

この記事からわかること

  • Swift UIリワード広告の実装方法
  • AdMob導入
  • 動画視聴報酬を得られる広告
  • GADRewardedAdGADFullScreenContentDelegate使い方
  • GADRewardedAdクラスのloadメソッドやpresentメソッドの使い方
  • リワード広告に1日1回視聴回数制限を設ける方法
  • フリークエンシーキャップとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Swift UIを使用している場合のAdMobを使用したリワード広告の実装方法をまとめて行きたいと思います。

リワード広告とは?

そもそもリワード広告とはアフィリエイト(成功報酬型)広告の1種で何かしらの報酬を付与する代わりに短い動画を視聴してもらう広告です。

iOSアプリに広告を掲載するには「Google AdMob」を導入します。「Google AdMob」はGoogleが提供しているiOSやAndroidなどのモバイルアプリに広告を設置できるサービスで、バナー広告をはじめリワード広告、インタースティシャル広告の実装も簡単に実装可能になっています。

Google AdSenseのホーム画面

使用するための注意点とポリシー

リワード広告をアプリに組み込む上では取り扱いに注意が必要です。公式サイトで注意点やポリシーが公開されているので違反しないように設計してください。

重要なところだけまとめておきます。

注意点

基本的には短い動画広告が配信されることと貰える報酬、そしてちゃんと報酬が与られるようにすれば問題ありません

Swift UIでリワード広告を実装する方法

流れ

  1. AdMobへ登録と広告ユニットの作成
  2. プロジェクトへAdMobの導入
  3. AdMob用のファイルを作成
  4. リワードクラスの作成
  5. 広告を読み込むメソッドの実装
  6. 読み込んだ広告を表示するメソッドの実装
  7. ビューとして呼び出す

今回はフレームワークにSwift UIを使用している場合のリワード広告の実装方法を見ていきます。AdMobが未登録の場合や広告ユニットが未作成、プロジェクトへ未導入の場合は下記記事をご覧ください。

AdMobでは開発途中のテスト実装の際は本番用の広告ユニットIDを使用せずテスト用の広告ユニットIDを使用することを推奨しています。テスト実装の際は以下のIDを然るべき箇所に記述してください。

// テスト用広告ユニットID
ca-app-pub-3940256099942544/1712485313

リワードクラスの作成

広告ユニットの作成とプロジェクトへAdMobの導入が完了したら実際にコードを書いていきます。まずはクラスの作成が必要なので今回は新しく「AdMobViewModels.swift」を作成しておきその中に記述していきます。

まずは必要なフレームワークとライブラリのimportを忘れずに記述しておき、作成するRewardクラスは必要なプロトコルに準拠させるように定義していきます。


import SwiftUI
import UIKit // こちらも必要
import GoogleMobileAds // 忘れずに

class Reward: NSObject, ObservableObject ,GADFullScreenContentDelegate {
    // リワード広告を読み込んだかどうか
    @Published  var rewardLoaded: Bool = false
    // リワード広告が格納される
    var rewardedAd: GADRewardedAd? = nil
    
    override init() {
        super.init()
    }
}

準拠させたプロトコルと意味

定義されたrewardedAdプロパティには実際に読み込まれたリワード広告が格納されるのでGADRewardedAd型でnilも許容できるようにしておきます。

読み込むメソッドの実装

公式リファレンス:GADRewardedAd

リワード広告を実際に読み込むためのメソッドを定義します。

GoogleMobileAdsライブラリをimportしたことでGADRewardedAdクラスが使えるようになっているのでその中のloadメソッドを呼び出します。

class func load(withAdUnitID adUnitID: String, request: GADRequest?) async throws -> GADRewardedAd

引数には「広告ユニットID」と「広告リクエストを送るためのGADRequestインスタンス」を渡します。

リクエストを送信してロードが完了した後にcompletionHandler広告(あればエラー情報も)が受け取れます


// リワード広告を読み込むメソッド
func loadReward() {
    GADRewardedAd.load(withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest(),completionHandler: { (ad, error) in   
        if let _ = error {
            // 失敗
            // 処理を終了
            self.rewardLoaded = false
            return
        }
        // 成功
        // 読み込みフラグと広告を格納
        self.rewardLoaded = true
        self.rewardedAd = ad
        self.rewardedAd?.fullScreenContentDelegate = self
    })
}

格納された広告(GADRewardedAdオブジェクト)は使用されると破棄されてしまうので何回も視聴できるように最後にfullScreenContentDelegateプロパティに自身を設定して終了です。

広告を表示させるメソッドの実装

続いて読み込んだ広告を表示させるメソッドを実装していきます。表示させるにはGADRewardedAdクラスのpresentメソッドを使用します。

func present(fromRootViewController rootViewController: UIViewController, userDidEarnRewardHandler: @escaping  GADUserDidEarnRewardHandler)

引数rootViewControllerには広告を表示するビューをUIViewController形式で渡し、ユーザーに報酬が与えられたタイミングでGADUserDidEarnRewardHandlerが実行されます。


// 読み込んだリワード広告を表示するメソッド
func showReward() {
    let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
    let rootVC = windowScene?.windows.first?.rootViewController
    if let ad = rewardedAd {
        ad.present(fromRootViewController: rootVC!, userDidEarnRewardHandler: {
            // 報酬を獲得
            self.rewardLoaded = false
        })
    } else {
        self.rewardLoaded = false
        self.loadReward()
    }
}

これで表示するための準備が整いました。

Swift UIでビューとして呼び出す

作成したクラスを表示したいビューで呼び出していきます。ObservableObjectプロトコルに準拠させているのでインスタンス化するクラスには@ObservedObjectをつけておきます。


import SwiftUI

struct ContentView: View {
    // AdMob reward広告
    @ObservedObject  var reward = Reward()

    var body: some View {
        Button(action: {
                  reward.showReward()
              }) {
                  Text("広告を視聴する")
              }.onAppear() {
                  reward.loadReward()
              }.disabled(!reward.rewardLoaded)
    }
}

ビューが表示されるタイミングで処理を実行するonAppearの中に広告を読み込むloadRewardメソッドを記述しておきます。広告を表示するshowRewardメソッドはボタンのアクション部分に記述しておきます。

これでボタンをクリック時にリワード広告が再生されるようになります。広告の読み込みが終了していない場合に備えてボタンを非アクティブにするdisabledに読み込みフラグを渡しておきました。

1日1回の視聴回数制限を設ける

リワード広告では視聴回数制限を設けることが推奨されています。今回は「1日に1回の視聴回数制限」を設けていきたいと思います。

ここで肝となるのは以下のポイントです。

@AppStorageはプロパティーラッパの1つでアプリが停止してもデータを保持することができます。ここに最後に視聴した日付を格納しておき、現在の日付と照らし合わせることで何回目の視聴か識別できるようにしています。

まずは上部に必要となるプロパティを定義していきます。


@State  var isAlertReward:Bool = false    // リワード広告視聴回数制限アラート
    
@AppStorage("LastAcquisitionDate") var lastAcquisitionDate = "" 

func nowTime() -> String{
        let df = DateFormatter()
        df.calendar = Calendar(identifier: .gregorian)
        df.locale = Locale(identifier: "ja_JP")
        df.timeZone = TimeZone(identifier: "Asia/Tokyo")
        df.dateStyle = .short
        df.timeStyle = .none
        return df.string(from: Date())
}

日付を取得するためのDateFormatterの使用方法に関しては以下の記事をご覧ください。

あとは日付を比較した結果によって処理を分岐させればOKです。


Button(action: {
    // 最終視聴日と現在の日付を比較
    if lastAcquisitionDate != nowTime() {
        reward.showReward()   
        lastAcquisitionDate = nowTime() // 最終視聴日を格納
    }else{
        isAlertReward = true
    }
}) {
   Text("広告を視聴する")
}
.onAppear() {
    reward.loadReward()
}
.disabled(!reward.rewardLoaded)
.alert(isPresented: $isAlertReward){
    Alert(title:Text("お知らせ"),
          message: Text("広告を視聴できるのは1日に1回までです"),
          dismissButton: .default(Text("OK"),
          action: {}))
}

フリークエンシーキャップ

リワード広告の視聴制限は広告ユニットごとに設定することも可能です。

AdMobから広告ユニットを作成する際に「詳細設定」をクリックし「フリークエンシーキャップ」という項目を有効にすると時間単位の視聴回数制限設けることができます

しかしこれはあくまで配信されるかされないかなので先ほどのようなUI側で明示的に表示できるように何かしらの機構を作っておくことをおすすめします。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

私がSwift UI学習に使用した参考書

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index