🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1737閲覧

追記AdMobのリワード広告を何度も呼び出したい

sunglass

総合スコア303

AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/02/26 07:40

編集2021/02/28 06:03

https://developers.google.com/admob/ios/rewarded-ads-v7?hl=ja
記事をもとにリワード広告を実装しました。

その際広告を一定時間見ると..

func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) { print(Int(truncating: reward.amount)) // ここでポイントを付与する }

としています。
1回目は問題なくポイント付与されるのですが2回目以降はリワード広告自体が表示されません。

https://i-app-tec.com/ios/rewarded-video-ads.html#4 をもとに

func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { statusLabel.text = "ad is closed" setupRewardBasedVideoAd() print("Reward based video ad is closed.") }

(も書いてみたのですがそもそも 警告が出ているので微妙です。)
GADRewardBasedVideoAdは非推奨のようなので Fixで修正しています。

ボタンを押して何回か(例:3回を上限とする)リワード広告を表示して
ポイントを付与したいです。
言語は Swiftです。

広告が表示されないのはテスト広告だからでしょうか。
それともドキュメント通りの実装だと1種類の広告しか出ないのでしょうか。

## 知りたいこと ・リワード広告を呼び出すたびに違う広告を表示して試聴時間が一定時間経過するとポイントが付与される実装が知りたいです。

詳しい方いましたらアドバイスお願いいたします。

追記
ドキュメンそのままBuildするとエラーが4つ出ます。

// // RewardAdViewController.swift import UIKit import GoogleMobileAds class RewardAdViewController: UIViewController, GADRewardedAdDelegate { var rewardedAd: GADRewardedAd? override func viewDidLoad() { super.viewDidLoad() rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313") rewardedAd?.load(GADRequest()) { error in if let error = error { // Handle ad failed to load case. print("読み込み失敗") } else { // Ad successfully loaded. print("読み込み成功") } } rewardedAd = createAndLoadRewardedAd() } // MARK: - Navigation @IBAction func stratRewardAd(_ sender: Any) { if rewardedAd?.isReady == true { rewardedAd?.present(fromRootViewController: self, delegate:self) } } // MARK: - AdMob /// Tells the delegate that the user earned a reward. func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) { print("Reward received with currency: (reward.type), amount (reward.amount).") } /// Tells the delegate that the rewarded ad was presented. func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) { print("Rewarded ad presented.") } /// Tells the delegate that the rewarded ad was dismissed. func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) { print("Rewarded ad dismissed.") rewardedAd = createAndLoadRewardedAd() } /// Tells the delegate that the rewarded ad failed to present. func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) { print("Rewarded ad failed to present.") } func createAndLoadRewardedAd() { rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313") rewardedAd?.load(GADRequest()) { error in if let error = error { print("Loading failed: (error)") } else { print("Loading Succeeded") } } return rewardedAd } }

イメージ説明

import UIKit import GoogleMobileAds class RewardAdViewController: UIViewController, GADRewardedAdDelegate { var rewardedAd: GADRewardedAd? override func viewDidLoad() { super.viewDidLoad() rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313") rewardedAd?.load(GADRequest()) { error in if error != nil { // Handle ad failed to load case. print("読み込み失敗") } else { // Ad successfully loaded. print("読み込み成功") } } } // MARK: - Navigation @IBAction func stratRewardAd(_ sender: Any) { if rewardedAd?.isReady == true { rewardedAd?.present(fromRootViewController: self, delegate:self) } } // MARK: - AdMob /// Tells the delegate that the user earned a reward. func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) { print("Reward received with currency: (reward.type), amount (reward.amount).") } /// Tells the delegate that the rewarded ad was presented. func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) { print("Rewarded ad presented.") } /// Tells the delegate that the rewarded ad was dismissed. func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) { print("Rewarded ad dismissed.") } /// Tells the delegate that the rewarded ad failed to present. func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) { print("Rewarded ad failed to present.") } func createAndLoadRewardedAd() { rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313") rewardedAd?.load(GADRequest()) { error in if let error = error { print("Loading failed: (error)") } else { print("Loading Succeeded") } } // return rewardedAd } }
// デバッグエリアログ 読み込み成功 Rewarded ad presented. Reward received with currency: coins, amount 10. 2021-02-28 14:59:02.513241+0900 iOS-Reward-Ad-Project[8303:164050] [View] First responder error: non-key window attempting reload - allowing due to manual keyboard (first responder window is <UIWindow: 0x7ffa14e12a80; frame = (0 0; 414 896); hidden = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x6000039291a0>; layer = <UIWindowLayer: 0x6000037f40e0>>, key window is <UIWindow: 0x7ffa14d09b80; frame = (0 0; 414 896); gestureRecognizers = <NSArray: 0x6000039f4d80>; layer = <UIWindowLayer: 0x60000379c080>>) Rewarded ad dismissed. 2021-02-28 14:59:02.798589+0900 iOS-Reward-Ad-Project[8303:164050] [assertion] Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Background" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing}> 2021-02-28 14:59:02.798776+0900 iOS-Reward-Ad-Project[8303:164050] [ProcessSuspension] 0x109dfe8c0 - ProcessAssertion: Failed to acquire RBS Background assertion 'WebProcess Background Assertion' for process with PID 8311, error: Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Background" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing} 2021-02-28 14:59:02.920755+0900 iOS-Reward-Ad-Project[8303:164050] [assertion] Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Suspended" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing}> 2021-02-28 14:59:02.922318+0900 iOS-Reward-Ad-Project[8303:164050] [ProcessSuspension] 0x109dfe900 - ProcessAssertion: Failed to acquire RBS Suspended assertion 'WebProcess Suspended Assertion' for process with PID 8311, error: Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Suspended" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing} 2021-02-28 14:59:02.999928+0900 iOS-Reward-Ad-Project[8303:164981] AudioObjectRemovePropertyListener: no object with given ID 0 2021-02-28 14:59:03.000632+0900 iOS-Reward-Ad-Project[8303:164981] AudioObjectRemovePropertyListener: no object with given ID 0 2021-02-28 14:59:03.001292+0900 iOS-Reward-Ad-Project[8303:164981] AudioObjectRemovePropertyListener: no object with given ID 0 2021-02-28 14:59:32.712346+0900 iOS-Reward-Ad-Project[8303:164050] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ドキュメント通りに実装すれば繰り返し表示することができます。

  • 広告の読み込みを正しく行っているか?
  • それは成功しているか? 失敗しているなら対処しているか?
  • 表示するためのAPIを正しく呼んでいるか?

というように順番に確認してみてはいかがでしょうか?

投稿2021/02/27 09:06

errolizer

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunglass

2021/02/27 16:45 編集

回答ありがとうございます。 ドキュメント通りにやると自分の環境では https://developers.google.com/admob/ios/rewarded-ads-v7?hl=ja#using_gadrewardedaddelegate_to_preload_the_next_rewarded_ad を実装するとエラーになります。 内容を(質問にも)追記しました。 ・広告の読み込みを正しく行っているか? >はい。追記のコード内でちゃんと『読み込み成功』がprintされます。 ・それは成功しているか? 失敗しているなら対処しているか? >成功はしていると思います。(1回目は)表示もされます。失敗はただのprint文のみです。ここで再度オブジェクトを作るのでしょうか? ・表示するためのAPIを正しく呼んでいるか? >ドキュメント通りに書いているとしかお答えできません。どこで確認すれば良いのでしょうか? ご確認よろしくお願いします。
errolizer

2021/02/28 00:38

詳細な情報ありがとうございます。 Admobのドキュメント通りにやってみました。動きませんね。すいませんでした! あくまでもチュートリアル形式なので、よしなに修正しなければなりません。 sunglass様のソースコードの修正ポイントは次の通りです。 1. createAndLoadRewardedAd の戻り値 return rewardedAd の行は削除しちゃってください。 呼び出している箇所も適宜修正です。 2. viewDidLoad() の処理 rewardedAd = GADRewardedAd() や rewardedAd?.load() は呼ばなくて良いので削除です。 これで毎回異なる広告が表示されます。 (テスト広告は種類が少ないので同じ広告が続けて出ることもあります)
sunglass

2021/02/28 05:48

回答ありがとうございます。 1と2の処理を行いました。 今度は広告自体が表示されなくなりました。。 後ほど修正後のコードを載せます。 お手隙の際にでもご確認ください。 よろしくお願いします。
errolizer

2021/02/28 05:54

表示されないとのことですが、読み込みはしていますか? 読み込みが成功しないと表示できないですよ。
sunglass

2021/02/28 06:00

viewDidLoad内の読み込み処理を追記しました。 ただやはり広告は1回のみの表示になっています。 後ほどデバッグエリア内のログも追記します。
errolizer

2021/02/28 07:19

createAndLoadRewardedAdがデッドコード(どこからも呼ばれていない)になっています。 viewDidLoadの下記の記述は不要ですので、代わりに上記メソッドを呼んでください。 rewardedAd = GADRewardedAd() rewardedAd?.load() また、広告を1回表示した後、次の広告をロードする必要があります。 タイミングとしては rewardedAdDidDismiss が適切です。
sunglass

2021/02/28 08:58 編集

すいません。 細かく確認させてください。 > viewDidLoadの下記の記述は不要ですので、代わりに上記メソッドを呼んでください。 override func viewDidLoad() { super.viewDidLoad() rewardedAd = GADRewardedAd() GADRewardedAd.load() } だけで良いでしょうか?? rewardedAd?.load()だとエラーが出て `GADRewardedAd`に変更を促されます。
sunglass

2021/02/28 08:57

> rewardedAdDidDismissでロードしてください。 func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) { print("Rewarded ad dismissed.") createAndLoadRewardedAd() } で良いでしょうか??
errolizer

2021/02/28 08:58

createAndLoadRewardedAd() だけで良いです。
errolizer

2021/02/28 08:59

rewardedAdDidDismissの方はそれでバッチリです。
sunglass

2021/02/28 08:59

リワード広告の視聴を開始するボタンのは createAndLoadRewardedAd()のみの呼び出しで大丈夫でしょうか?? @IBAction func stratRewardAd(_ sender: Any) { createAndLoadRewardedAd() }
errolizer

2021/02/28 09:00

ダメです。それだとボタンを押した時に広告をロードしてしまいますよ。
sunglass

2021/02/28 09:08

どうすれば良いでしょうか??
errolizer

2021/02/28 09:09

公式の通りです。 基本的には公式の通りにやってください。そして自分のプログラムに合わなかったりする場合は適宜調整してください。
sunglass

2021/02/28 09:13

@IBAction func stratRewardAd(_ sender: Any) { print("広告を見るボタン押下") if rewardedAd?.isReady == true { rewardedAd?.present(fromRootViewController: self, delegate:self) } } (公式の通り)だと広告表示されないです。。 広告の表示の流れって広告の読み込み→表示→閉じる→広告の読み込み→表示だと思うのですがこの理解は間違えていますでしょうか??
errolizer

2021/02/28 09:22

理解はあっています。 広告を閉じた時に、広告をロードしているかを確認してください。 それが成功しているかを確認してください。 順番にひとつひとつ確認することが大切です。 広告は繰り返し表示できることはこちらで確認しています。
sunglass

2021/02/28 09:25

> 理解はあっています。 ありがとうございます。 >広告を閉じた時に、広告をロードしているかを確認してください。 現在のコードだと(1回目の)広告自体が表示されないです。。 まずは広告表示できるようにしてみます
errolizer

2021/02/28 09:27

広告のロードが成功 or 失敗のどちらの場合でもログを出力していますよね? ログを見ればわかるんじゃないんですか?
sunglass

2021/02/28 09:33

以下で出来ました。。 @IBAction func stratRewardAd(_ sender: Any) { // createAndLoadRewardedAd() print("広告を見るボタン押下") // 広告の読み込み開始 rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313") rewardedAd?.load(GADRequest()) { error in if let error = error { print("Loading failed: (error)") } else { print("Loading Succeeded") // 読み込み成功したら表示 if self.rewardedAd?.isReady == true { self.rewardedAd?.present(fromRootViewController: self, delegate:self) print("広告表示完了") } else{ print("広告表示失敗しているかも。原因探してね。。") } } } }
sunglass

2021/02/28 09:34

これで合っていますでしょうか??
errolizer

2021/02/28 09:36

いえ、これだとボタンを押してから読み込み開始していますね。 テスト広告は数秒でロードできるから問題ないように見えるかもしれませんが、本番の広告は10秒以上かかることもあります。ですので先にロードしておくことが重要です。
errolizer

2021/02/28 09:41

ちなみに実際のアプリの実装では、広告のロードが完了して広告表示可能になったタイミングでボタンを押下可能にする、という形にすることが多いです。 そして一度広告を表示した後は再度ロードに入るので、ボタンを押下不可にすべきです。 この繰り返しです。
sunglass

2021/02/28 09:43

出来ました。。 override func viewDidLoad() { super.viewDidLoad() createAndLoadRewardedAd() // rewardedAd = GADRewardedAd() // GADRewardedAd.load() } 不要そうなものをコメントアウト。 ボタンアクション内では広告表示内だけの処理にしました。 するとボタン押下と同時に広告が出るようになりました。 閉じる(Desimiss)押した後も同じ広告が何度も出ます。 これで合っていますでしょうか??
errolizer

2021/02/28 09:46

はい。大丈夫です。 テスト広告は数が少ないので同じ広告が結構でます。 毎回ロードしていることをログで確認してください。 また、広告を最後まで見ずに途中でやめた場合も広告が再ロードされていることをログで確認すると良いです。
sunglass

2021/02/28 09:48

最後までお付き合いいただき本当にありがとうございます..! > ちなみに実際のアプリの実装では、広告のロードが完了して広告表示可能になったタイミングでボタンを押下可能にする、という形にすることが多いです。 こちらもアドバイスありがとうございます。 Loading Succeeded されると `button.isEnabled = true` みたいに広告の読み込み状況でボタンの活性化・不活性化の処理を足してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問