You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:14:12