質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
AdMob

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

Swift

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

Q&A

解決済

2回答

2557閲覧

AdMobリワード広告の視聴を途中で中断した場合のリワード広告のリロード

sacakoro

総合スコア35

AdMob

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

Swift

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

0グッド

1クリップ

投稿2020/10/20 01:17

AdMobリワード広告を実装しています。
以下のクラスで、AdMobリワード広告のロード、表示などを制御しています。
AdMobリワード広告を最後まで視聴し切った場合は、広告のリロードが正しく機能するのですが、
AdMobリワード広告の視聴を途中で中断してしまった場合、広告のリロードが機能しません。
途中で中断すると、extension部分で宣言しているdelegateメソッドがどれも呼ばれないからリロードもできないというところまではわかりました。

リワード広告の視聴を途中で中断したということを検知することはできないでしょうか?
次回、リワード広告を表示させるには、アプリを再起動するしかないのでしょうか?

import Foundation import Firebase // AdMobManagerからリワード値を取得したい場合にはこのプロトコルを定義すること public protocol AdMobManagerRewarder { func gotReward(amount: NSDecimalNumber) } public class AdMobRewardManager : NSObject, GADRewardedAdDelegate { var adMobId : String? var rewardedAd: GADRewardedAd? var parent: UIViewController? // AdMobManagerのイニシャライザ public init(parent: UIViewController) { super.init() self.parent = parent } // Admobのリワード広告の広告IDをセットする public func setReward(_ adMobId: String) -> Void { self.adMobId = adMobId createAndLoadRewardedAd() } public func displayReward() { if self.rewardedAd?.isReady == true { self.rewardedAd?.present(fromRootViewController: self.parent!, delegate:self) } else { print("reward is not Ready.") } } func createAndLoadRewardedAd() { self.rewardedAd = GADRewardedAd(adUnitID: self.adMobId!) self.rewardedAd?.load(GADRequest()) { error in if let error = error { print("AdMobRewardManager : Loading failed: (error)") } else { print("AdMobRewardManager : Loading Succeeded") } } } // リワード広告の準備ができていればtrue, で綺麗なければfalseを返すメソッド public func rewardAdIsReady() -> Bool { if self.rewardedAd?.isReady == true { #if DEBUG NSLog("reward Ad is ready") #endif return true } else { #if DEBUG NSLog("reward Ad is not ready") #endif return false } } } extension AdMobRewardManager { /// Tells the delegate that the user earned a reward. public func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) { print("Reward received with currency: (reward.type), amount (reward.amount).") (self.parent as! AdMobManagerRewarder).gotReward(amount: reward.amount) createAndLoadRewardedAd() } /// Tells the delegate that the rewarded ad was presented. func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) { createAndLoadRewardedAd() print("AdMobRewardManager : Rewarded ad presented.") } /// Tells the delegate that the rewarded ad was dismissed. func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) { createAndLoadRewardedAd() print("AdMobRewardManager : Rewarded ad dismissed.") } /// Tells the delegate that the rewarded ad failed to present. func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) { createAndLoadRewardedAd() print("AdMobRewardManager : Rewarded ad failed to present.") } }

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

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

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

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

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

guest

回答2

0

自己解決

解決いたしました。

今回の問題はまず、rewardedAdDidPresent、rewardedAdDidDismiss、rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error)のdelegateメソッドが呼ばれていなかったという問題でした。
この点については、3メソッドをpublicにしたことで呼ばれるようになりました。

public func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) { createAndLoadRewardedAd() print("AdMobRewardManager : Rewarded ad dismissed.") }

次に、terotail様ご指摘の通り、rewardedAdDidPresent内のcreateAndLoadRewardedAdmob()の呼び出しを削除いたしました。

以上の対処で、rewardedAdDidDismissが呼ばれるようになり、かつrewardedAdDidDismiss内部でcreateAndLoadRewardedAdmobが呼ばれることもなくなったので、リワード広告を途中で見るのをやめてもリワード広告が再読み込みされるようになりました。

投稿2020/11/18 12:39

編集2020/11/18 12:41
sacakoro

総合スコア35

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

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

0

func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd)
で createAndLoadRewardedAd()を呼んでいるのが原因です。
広告が上書きされてしまうため、rewardedAdDidDismissが正常にハンドリングされません。

投稿2020/11/16 12:00

errolizer

総合スコア441

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

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

sacakoro

2020/11/16 14:08

ご指摘ありがとうございます。広告が表示された場合、デリゲートとしてrewardedAdDidPresentがよばれるわけですが、広告が表示された後に再度リワード広告の準備をするにはどうしたらいいのでしょうか。
errolizer

2020/11/16 14:10

rewardedAdDidDismiss で次の広告を読み込んでください。
sacakoro

2020/11/17 00:55

回答ありがとうございます。やってみます。
sacakoro

2020/11/18 06:14

試してみたのですが、そもそもrewardedAdDidDismissが呼ばれませんでした。
errolizer

2020/11/18 06:23

ふむ。こちらでは呼ばれてますね。 createAndLoadRewardedAd()を削除しましたか? また、他の変なタイミングで呼ぶと、呼ばれなくなりますので確認してみてください。
errolizer

2020/11/18 09:14

rewardedAdDidPresent で広告読み込みしていないのであれば、他に考えられるのは呼び元のコーディングですね。 このクラスのプロパティは外から丸見えなので、呼び元からnilを突っ込んだりしてませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問