【Swift UI】AdMobのリワード広告の実装方法!GADFullScreenContentDelegate
この記事からわかること
- Swift UIでリワード広告の実装方法
- AdMobを導入
- 動画視聴で報酬を得られる広告
- GADRewardedAdやGADFullScreenContentDelegateの使い方
- GADRewardedAdクラスのloadメソッドやpresentメソッドの使い方
- リワード広告に1日1回の視聴回数制限を設ける方法
- フリークエンシーキャップとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swift UIを使用している場合のAdMobを使用したリワード広告の実装方法をまとめて行きたいと思います。
リワード広告とは?
そもそもリワード広告とはアフィリエイト(成功報酬型)広告の1種で何かしらの報酬を付与する代わりに短い動画を視聴してもらう広告です。
iOSアプリに広告を掲載するには「Google AdMob」を導入します。「Google AdMob」はGoogleが提供しているiOSやAndroidなどのモバイルアプリに広告を設置できるサービスで、バナー広告をはじめリワード広告、インタースティシャル広告の実装も簡単に実装可能になっています。
使用するための注意点とポリシー
リワード広告をアプリに組み込む上では取り扱いに注意が必要です。公式サイトで注意点やポリシーが公開されているので違反しないように設計してください。
重要なところだけまとめておきます。
注意点
- クリックを促すような記述をしない
- 視聴後に価値のある報酬を提供すること
- ランダム報酬の場合は明示する
- ユーザーの同意がある時のみ配信可能にする
- 視聴制限を設けることが推奨
基本的には短い動画広告が配信されることと貰える報酬、そしてちゃんと報酬が与られるようにすれば問題ありません
。
Swift UIでリワード広告を実装する方法
流れ
- AdMobへ登録と広告ユニットの作成
- プロジェクトへAdMobの導入
- AdMob用のファイルを作成
- リワードクラスの作成
- 広告を読み込むメソッドの実装
- 読み込んだ広告を表示するメソッドの実装
- ビューとして呼び出す
今回はフレームワークに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()
}
}
準拠させたプロトコルと意味
- NSObject:スーパークラス
- ObservableObject:クラス変更を観測
- GADFullScreenContentDelegate:SDKから通知を受け取るデリゲートメソッドを実装
定義されたrewardedAd
プロパティには実際に読み込まれたリワード広告が格納されるのでGADRewardedAd
型でnil
も許容できるようにしておきます。
読み込むメソッドの実装
リワード広告を実際に読み込むためのメソッドを定義します。
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:データをアプリが停止しても保持する
- nowTimeメソッド:現在の日付を返す自作メソッド
- alertモディファイア:通知ポップアップを表示する
@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学習に使用した参考書