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();
额外说明
- 关于你提到的
RewardedAdEventType.CLOSED未定义的问题,这确实是6.x版本的一个已知小bug,暂时用字符串'closed'是可行的,如果后续升级到更高版本(比如7.x+),记得改回枚举值。 - 每次创建新实例前,记得调用
offAdEvent()移除旧实例的监听,避免内存泄漏和重复触发事件。
内容的提问来源于stack exchange,提问作者Ilya Karnaukhov
相关产品推荐
相关产品推荐

