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

react-native-firebase/admob中rewardedAd.load()二次加载失效求助

解决react-native-firebase/admob 6.x中RewardedAd二次load()无响应的问题

我之前在使用react-native-firebase/admob的6.2.0和6.3.1版本时,碰到过和你完全一样的问题——首次加载、展示广告一切正常,但关闭后第二次调用rewardedAd.load()毫无反应,连错误回调都没有,调用show()就会触发admob/not-ready错误。折腾了好一阵才找到根源和解决办法。

问题根源

在这个版本的库中,RewardedAd实例是一次性的。当广告被展示并触发closed事件后,这个实例的内部状态已经处于“过期”状态,无法再用来加载新的广告请求,直接调用load()不会触发任何内部逻辑,自然也不会有回调。

解决方案:每次广告关闭后重新创建实例

不要复用同一个RewardedAd实例,每次需要加载新广告时,都重新创建一个实例并绑定事件监听器。我把你的代码修改成了可复用的逻辑,这样就能解决二次加载无响应的问题:

let rewardedAd;
let rewarded = false;

// 封装创建并配置广告实例的函数
const createAndSetupRewardedAd = () => {
  // 先移除旧实例的事件监听,避免内存泄漏
  if (rewardedAd) {
    rewardedAd.offAdEvent();
  }

  // 创建新的广告实例
  if(environment === 'development'){
    rewardedAd = RewardedAd.createForAdRequest(TestIds.REWARDED)
  } else if(environment === 'production'){
    rewardedAd = RewardedAd.createForAdRequest(settings.adsUnitIds.ios.real)
  }

  // 绑定广告事件监听
  rewardedAd.onAdEvent((type, error, reward) => {
    console.log('onAdEvent, type:', type, ', error:', error)
    
    if(type === RewardedAdEventType.LOADED){
      dispatch({ type: 'AD_LOADED' })
    }
    
    if(type === 'closed'){ // 这里的字符串兼容是临时方案,确实是6.x的小bug
      console.log('ad closed, rewarded:', rewarded)
      if(rewarded){
        const rewardCoinsAmount = doubleReward ? settings.coins.ad * 2 : settings.coins.ad;
        dispatch(rewardCoins(rewardCoinsAmount, 'watched-ad'))
        rewarded = false
      }
      dispatch({ type: 'AD_CLOSED', rewarded })
      if(showEnded) showEnded()
      
      setTimeout(() => {
        console.log('Start ad re-request')
        // 重新创建实例并加载新广告
        createAndSetupRewardedAd();
        rewardedAd.load();
      }, 200)
    }
    
    if(type === RewardedAdEventType.EARNED_REWARD){
      console.log('earned reward!')
      dispatch({ type: 'AD_REWARDED' })
      rewarded = true
    }
    
    if(type === RewardedAdEventType.ERROR){
      console.info('Some error with ad:', error)
      // 出错后也尝试重新创建实例加载
      setTimeout(() => {
        createAndSetupRewardedAd();
        rewardedAd.load();
      }, 1000)
    }
  })
}

// 首次初始化加载广告
createAndSetupRewardedAd();
rewardedAd.load();

额外说明

  1. 关于你提到的RewardedAdEventType.CLOSED未定义的问题,这确实是6.x版本的一个已知小bug,暂时用字符串'closed'是可行的,如果后续升级到更高版本(比如7.x+),记得改回枚举值。
  2. 每次创建新实例前,记得调用offAdEvent()移除旧实例的监听,避免内存泄漏和重复触发事件。

内容的提问来源于stack exchange,提问作者Ilya Karnaukhov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:02:57