From 0375fc09a9feec8bff7c6848638fa7b3e0d52c58 Mon Sep 17 00:00:00 2001 From: zeng Date: Thu, 10 Jul 2025 16:35:54 +0800 Subject: [PATCH] no message --- .../SPRewardedAdManager+Admob.swift | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 ThimraTV/Libs/AdManager/RewardedAd/SPRewardedAdManager+Admob.swift diff --git a/ThimraTV/Libs/AdManager/RewardedAd/SPRewardedAdManager+Admob.swift b/ThimraTV/Libs/AdManager/RewardedAd/SPRewardedAdManager+Admob.swift new file mode 100644 index 0000000..62c3be2 --- /dev/null +++ b/ThimraTV/Libs/AdManager/RewardedAd/SPRewardedAdManager+Admob.swift @@ -0,0 +1,139 @@ +// +// SPAdManager+admob.swift +// ThimraTV +// +// Created by 长沙佳儿 on 2025/7/9. +// + +import UIKit +import GoogleMobileAds + +extension SPRewardedAdManager { + + fileprivate struct AssociatedKeys { + static var admob_rewardedAd: Int? + static var admob_needShowRewardedAd: Int? + static var admob_isLoadingRewardedAd: Int? + } + + var admob_rewardedAd: RewardedAd? { + set { + objc_setAssociatedObject(self, &AssociatedKeys.admob_rewardedAd, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + get { + return objc_getAssociatedObject(self, &AssociatedKeys.admob_rewardedAd) as? RewardedAd + } + } + ///广告是否在加载中 + var admob_isLoadingRewardedAd: Bool { + set { + objc_setAssociatedObject(self, &AssociatedKeys.admob_isLoadingRewardedAd, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + get { + return (objc_getAssociatedObject(self, &AssociatedKeys.admob_isLoadingRewardedAd) as? Bool) ?? false + } + } + + ///是否需要展示广告,true广告加载完成会直接展示广告 + private var admob_needShowRewardedAd: Bool { + set { + objc_setAssociatedObject(self, &AssociatedKeys.admob_needShowRewardedAd, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + get { + return (objc_getAssociatedObject(self, &AssociatedKeys.admob_needShowRewardedAd) as? Bool) ?? false + } + } + + + ///加载并展示广告 + func admob_loadAndShowRewardedAd(adInfo: SPAdInfo) { + self.admob_needShowRewardedAd = true + + if self.admob_isLoadingRewardedAd { + return + } + + if self.admob_rewardedAd != nil { + self.admob_show() + return + } + + + admob_loadRewardedAd(adInfo: adInfo) + } + + func admob_loadRewardedAd(adInfo: SPAdInfo) { + guard !self.admob_isLoadingRewardedAd else { return } + + let adUnitID = adInfo.ads_id ?? "" + let request = Request() + + self.admob_isLoadingRewardedAd = true + spLog(message: "====Ad 加载广告") + RewardedAd.load(with: adUnitID, request: request) { [weak self] rewardedAd, error in + guard let self = self else { return } + self.admob_isLoadingRewardedAd = false + + if let error = error { + self.admob_needShowRewardedAd = false + self.loadFailHandler(error: error) + spLog(message: "====Ad 广告加载失败") + return + } + self.loadFinishHandler() + + self.admob_rewardedAd = rewardedAd + self.admob_rewardedAd?.fullScreenContentDelegate = self + + if self.admob_needShowRewardedAd { + self.admob_show() + } + spLog(message: "====Ad 广告加载成功") + + } + } + + ///展示广告 + private func admob_show() { + guard let rewardedAd = admob_rewardedAd, self.admob_needShowRewardedAd else { + return print("====Ad wasn't ready.") + } + self.admob_needShowRewardedAd = false + + // The UIViewController parameter is an optional. + rewardedAd.present(from: nil) { [weak self] in + let reward = rewardedAd.adReward + print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)") + self?.userDidEarnRewardHandler() + // TODO: Reward the user. + } + } +} + +extension SPRewardedAdManager: FullScreenContentDelegate { + + /// Tells the delegate that the ad failed to present full screen content. + func ad(_ ad: FullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { + self.admob_rewardedAd = nil + self.admob_needShowRewardedAd = false + self.displayFailHandler(error: error) + } + + /// Tells the delegate that the ad will present full screen content. + func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) { + print("====Ad will present full screen content.") + self.didShowHandler() + } + + /// Tells the delegate that the ad dismissed full screen content. + func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) { + print("====Ad did dismiss full screen content.") + self.admob_rewardedAd = nil + self.didDismissHandler() + + } + + func adDidRecordClick(_ ad: any FullScreenPresentingAd) { + self.didClickHandler() + } +}