SwiftUIで AdMob SDK v8対応のリワード広告を出す
タイトルの通りですが、この記事でやることはこちら。
AdMobでiOSアプリに出せる広告の種類
リワード広告の実装方法だけ見たいという方は、下まで飛ばしてもらって大丈夫です。
AdMobを使ってiOSアプリに出せる広告は、以下の6種類あります。
- バナー広告
- インタースティシャル広告
- リワードインタースティシャル広告(β版)
- リワード広告
- ネイティブアドバンス広告
- アプリ起動広告
この中で、よく使うものは太字のものだと思うので、それについてざっくりとまとめておきます。
バナー広告
アプリの画面上部や下部に常に居座る帯状の広告ですね。
とりあえず余白があれば、実装しておくといいやつです。
バナー広告の実装方法は、別記事にまとめてありますので、気になる人はこちらもどうぞ。
インタースティシャル広告
画面が切り替わるタイミングで、画面全体に出る5秒くらいでスキップできる動画広告です。
ゲームアプリでゲームオーバーになったタイミングでよく出てくるやつです。
バナー広告より単価が10倍くらいらしいので、画面が切り替わるようなアプリでは、積極的に実装していきたいですね。
リワード広告
ユーザが報酬を受け取ることを目的に、能動的に視聴する30秒くらいのスキップできない動画広告です。
広告自体は、インタースティシャル広告と似ていますが、大きく違う点は、以下です。
- ユーザが広告動画を視聴することを選択する必要がある
- 約30秒と長くスキップできない
- 視聴することでユーザは何かしら報酬を得る
ゲームで、広告を見るとスタミナ回復が無料でできたりするアレです。
これは、インタースティシャル広告の3倍(バナーの30倍)くらいの単価らしいので、使いたいですね。
うまく活用すれば、ユーザも無料で報酬を得られるので、win-winの関係が作れます。
今一番注目されている広告のタイプですね。
今回は、このリワード広告をAdMobを使ってiOSアプリに実装する方法を解説します。
AdMob SDK v8でリワード広告実装
「AdMob リワード広告 swiftUI」とかでググるとそれっぽい記事が出てくるんですが、SDKが最近バージョンアップされ、だいぶ実装方法が変わってます。
そのせいで、最新の実装方法がよくわからなかったので、忘備録も兼ねて書いておきます。
一応、公式ページにv8への移行方法が書いてあるんですが、swiftUIじゃないんですよね。
SwiftUIで AdMob SDK v8 リワード広告実装方法
最初に、完成品を書いておきます。
広告実装部分
import Foundation
import GoogleMobileAds
class RewardedAdDelegate: NSObject, GADFullScreenContentDelegate, ObservableObject {
static var instance = RewardedAdDelegate()
var rewardedAd: GADRewardedAd?
override init() {
super.init()
let request = GADRequest()
// これはテストIDなので、リリース時に自分のリワード広告IDに書き換える
GADRewardedAd.load(withAdUnitID: "ca-app-pub-8123415297019784/4985798738",
request: request, completionHandler: { (ad, error) in
if let error = error {
// print("Rewarded ad failed to load with error: \(error.localizedDescription)")
return
}
self.rewardedAd = ad
self.rewardedAd?.fullScreenContentDelegate = self
}
)}
// 広告を表示して報酬を獲得する
func showRewardedAd() {
let root = UIApplication.shared.windows.first?.rootViewController
if let ad = rewardedAd {
ad.present(fromRootViewController: root!,
userDidEarnRewardHandler: {
print("報酬を獲得しました。")
})} else {
print("Ad wasn't ready")
}
}
// Tells the delegate that the rewarded ad was presented.
func adDidPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
}
// Tells the delegate that the rewarded ad was dismissed.
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
// 動画の視聴を途中で止めるなどで報酬を獲得できなかった時に、インスタンスを作り直す
// インスタンスは使い捨てなので、作り直さないと再視聴できない
RewardedAdDelegate.instance = RewardedAdDelegate()
}
// Tells the delegate that the rewarded ad failed to present.
func ad(_ ad: GADFullScreenPresentingAd,
didFailToPresentFullScreenContentWithError error: Error) {
print("Rewarded ad failed to present with error: \(error.localizedDescription).")
}
}
リワード広告表示部分
import Foundation
import SwiftUI
struct ContentView: View {
let reward = RewardedAdDelegate.instance
@State var rewardAlert = false
var body: some View {
Button(action: {
rewardAlert = true
}){
Text("報酬獲得ボタン")
}
.alert(isPresented: $rewardAlert, content: {
Alert(
title: Text("報酬を獲得しますか?"),
message: Text("動画を視聴すると報酬が獲得できます。"),
primaryButton: .cancel(Text("キャンセル"),action: {
rewardAlert = false
}),
secondaryButton: .default(Text("はい"),action: {
rewardAlert = false
reward.showRewardedAd()
})
)
})
}
}
リワード広告はユーザが視聴するかの選択が必要になるので、ボタンを押した後に確認のアラートを出しています。
また、これとは別に、AdMobの基本設定(AppDelegateの記述、info.plistの記述)はもちろん必要です。
基本設定箇所については、今回触れませんので、そちらがまだの人は、バナー実装の方に書いてありますので、参考にしてください。
解説
リワード広告側の解説を書いておきます。
SDK v8で変わったところは、GADRewardedAdDelegateではなく、GADFullScreenContentDelegateを使うようになった点です。
これからはこちらを使いましょう。
class RewardedAdDelegate: NSObject, GADFullScreenContentDelegate, ObservableObject {
初期化部分で、広告を読み込みます。
ca-app-pub-8123415297019784/4985798738 はテストIDなので、リリース時に書き換えることを忘れずに。
テストIDもここに書いてあります。
override init() {
super.init()
let request = GADRequest()
// これはテストIDなので、リリース時に自分のリワード広告IDに書き換える
GADRewardedAd.load(withAdUnitID: "ca-app-pub-8123415297019784/4985798738",
request: request, completionHandler: { (ad, error) in
if let error = error {
// print("Rewarded ad failed to load with error: \(error.localizedDescription)")
return
}
self.rewardedAd = ad
self.rewardedAd?.fullScreenContentDelegate = self
}
)
あとは、広告を表示したいタイミングで、これを呼び出してあげるだけです。
注意点としては、リワード広告はユーザが選択して視聴する必要があるので、必ずボタンなどの処理を入れてください。画面切り替えのタイミングで勝手に入れるとgoogleに怒られます。
func showRewardedAd() {
let root = UIApplication.shared.windows.first?.rootViewController
if let ad = rewardedAd {
ad.present(fromRootViewController: root!,
userDidEarnRewardHandler: {
print("報酬を獲得しました。")
})} else {
print("Ad wasn't ready")
}
}
以下の3つは、上からそれぞれ以下のタイミングで呼ばれます。
- 広告が表示されたタイミング
- 報酬獲得が失敗したタイミング
- 既に報酬を獲得している場合
// Tells the delegate that the rewarded ad was presented.
func adDidPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
}
// Tells the delegate that the rewarded ad was dismissed.
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
// 動画の視聴を途中で止めるなどで報酬を獲得できなかった時に、インスタンスを作り直す
// インスタンスは使い捨てなので、作り直さないと再視聴できない
RewardedAdDelegate.instance = RewardedAdDelegate()
}
// Tells the delegate that the rewarded ad failed to present.
func ad(_ ad: GADFullScreenPresentingAd,
didFailToPresentFullScreenContentWithError error: Error) {
print("Rewarded ad failed to present with error: \(error.localizedDescription).")
}
注意点は、このインスタンスは使い捨てなので、使いまわそうとしても使えません。
報酬獲得失敗して再度獲得しようとしても獲得できないので、毎回インスタンスを作り直してあげる必要があります。
まとめ
今回は、SwiftUIで AdMob SDK v8対応のリワード広告を出す方法について書きました。
リワード広告は単価も高く、ユーザにもメリットがあるので、積極的に使っていきたいですね。
実際にリワード広告を導入したアプリはこちらで公開していますので、よければ見てみて下さい。
Spot Guide – スポットガイド
無料posted withアプリーチ
iOSアプリ開発をするなら読んでおきたい書籍をこちらで紹介しています。
> 本当に役立つ技術書まとめ
全て本当に自分が読んで良かったものを紹介しているので、参考になると思います。
プログラミングを効率的に学ぶには、Udemyがオススメです。
Udemyは、世界最大の教育プラットフォームで、動画でスキルを学ぶことができます。
Webサービス・スマホアプリ・ゲーム開発に役立つプログラミングスキルはもちろん、ブログやYouTubeで稼ぐために必要な集客・ブランディングなどを学ぶことができます。
セール期間中は、95%OFFになったり、30日間の全額返金保証もついているので、お得に安心して利用できます。
コメント