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.") } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。