关联Firebase后AdMob奖励视频广告代码失效问题求助
解决关联Firebase后AdMob奖励视频广告代码失效的问题
嘿,我完全懂你的困惑——代码没动,只是关联了Firebase就突然报错,这太闹心了!其实问题根源很明确:关联Firebase后,你的AdMob SDK被自动升级到了新版本,而新版本的GADRewardedAd API和你之前的旧代码完全不兼容。
咱们逐个拆解你的错误:
第一个错误:Instance member 'load' cannot be used on type 'GADRewardedAd'; did you mean to use a value of this type instead?
在旧版AdMob SDK中,你可能是先创建GADRewardedAd实例再调用load方法,但新版本里load已经变成了类方法,不需要先实例化,直接通过GADRewardedAd类型调用即可。
第二个错误:Contextual closure type '(GADRequestError?) -> Void' expects 1 argument, but 2 were used in closure body ...
这个错误说明你闭包里写了两个参数(比如旧版可能是(ad, error)),但新版的回调闭包参数签名已经变了——现在的load方法完成回调会返回两个参数:加载成功的广告实例(可选)和错误信息(可选),而你原来的代码可能是基于旧版只传单个参数的逻辑写的,自然就不匹配了。
给你一份适配新版SDK的正确代码示例
import GoogleMobileAds // 先声明一个变量保存加载好的广告实例 private var rewardedAd: GADRewardedAd? // 加载奖励视频广告的方法 func loadRewardedAd() { let adUnitID = "你的广告单元ID" // 替换成你自己的ID GADRewardedAd.load(withAdUnitID: adUnitID, request: GADRequest()) { [weak self] ad, error in guard let self = self else { return } if let error = error { print("奖励视频广告加载失败: \(error.localizedDescription)") self.rewardedAd = nil return } // 保存加载成功的广告 self.rewardedAd = ad // 设置全屏内容代理,监听广告展示、关闭等事件 self.rewardedAd?.fullScreenContentDelegate = self print("奖励视频广告加载成功") } } // 展示奖励视频广告的方法 func showRewardedAd() { guard let ad = rewardedAd else { print("广告未加载完成,先调用loadRewardedAd()") return } // 这里替换成你的根视图控制器 guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { return } ad.present(fromRootViewController: rootVC, userDidEarnRewardHandler: { // 用户成功观看广告后,执行奖励逻辑 let reward = ad.adReward print("用户获得奖励:\(reward.amount) \(reward.type)") // 这里写你的奖励发放代码,比如给用户加金币、解锁内容等 }) } // 实现GADFullScreenContentDelegate代理方法(可选,用于监听广告状态) extension YourViewController: GADFullScreenContentDelegate { func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { print("广告展示失败: \(error.localizedDescription)") rewardedAd = nil // 展示失败后清空实例,后续重新加载 } func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { print("广告关闭") rewardedAd = nil // 关闭后清空实例,准备加载下一个广告 loadRewardedAd() // 可选:自动加载下一个广告 } }
额外提醒
你可以检查一下Podfile里的依赖版本,Firebase的相关组件(比如Firebase/Crashlytics)通常会依赖较新的Google-Mobile-Ads-SDK版本,关联Firebase后CocoaPods会自动更新这个SDK,这就是为什么你没改代码却突然报错的原因。
只要把旧代码改成上面的新版API用法,就能解决问题啦!
内容的提问来源于stack exchange,提问作者Marwan Tragha
相关产品推荐
相关产品推荐

