Expo React Native安卓应用InterstitialAd加载失败及初始化异常求助
问题解决:React Native Expo 中 Google Mobile Ads 初始化重复+广告加载失败
一、初始化重复执行的修复
初始化代码执行两次是因为Expo开发环境默认启用了React StrictMode,会触发副作用函数重复执行(生产环境会自动恢复正常)。只需将初始化逻辑放到useEffect中并添加空依赖数组,确保仅执行一次:
// App.js 修改后的初始化代码 import { useEffect } from 'react'; import { mobileAds } from 'react-native-google-mobile-ads'; function App() { useEffect(() => { mobileAds().initialize() .then(adapterStatuses => { console.log('Mobile ads initialized!', adapterStatuses); }) .catch(error => { console.error('Error initializing mobile ads:', error); }); }, []); // 空依赖数组确保仅在组件挂载时执行一次 // 其他组件逻辑... }
如果需要在开发环境验证单次执行效果,可暂时移除App组件外层的StrictMode包裹,但上线前建议恢复(StrictMode有助于提前发现组件潜在问题)。
二、广告无法加载/展示的排查方案
1. 确认测试广告ID的正确性
必须使用Google官方提供的测试广告ID,避免个人正式ID因未通过审核、无广告填充等原因无法加载:
- 安卓测试奖励广告ID:
ca-app-pub-3940256099942544/5224354917 - 安卓测试插屏广告ID:
ca-app-pub-3940256099942544/1033173712
2. 钩子用法规范(以useRewardedAd为例)
必须监听广告加载状态,仅在isLoaded为true时调用show(),同时监听加载失败事件获取具体错误信息:
// reward.js 正确示例代码 import { useEffect } from 'react'; import { useRewardedAd } from 'react-native-google-mobile-ads'; const REWARDED_TEST_ID = 'ca-app-pub-3940256099942544/5224354917'; function RewardScreen() { const { adLoaded, adFailedToLoad, isLoaded, load, show } = useRewardedAd(REWARDED_TEST_ID); // 监听加载状态 useEffect(() => { if (adLoaded) { console.log('奖励广告加载成功'); } if (adFailedToLoad) { console.error('广告加载失败原因:', adFailedToLoad); // 关键:获取具体错误信息 } }, [adLoaded, adFailedToLoad]); // 加载广告 const handleLoad = () => { if (!isLoaded) load(); }; // 展示广告(仅在加载完成后触发) const handleShow = () => { if (isLoaded) show(); else console.log('广告未加载完成,无法展示'); }; return ( <> <button onPress={handleLoad}>加载奖励广告</button> <button onPress={handleShow} disabled={!isLoaded}>展示广告</button> </> ); }
3. 验证配置正确性
确保app.json中插件配置格式正确:
{ "expo": { "plugins": [ [ "react-native-google-mobile-ads", { "android_app_id": "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy" // 替换为你的AdMob安卓APP ID } ] ] } }
无需手动修改AndroidManifest.xml,Expo插件会自动注入必要配置。
4. 网络与环境检查
- 测试设备需能正常访问Google服务,国内设备需确保网络环境可连接AdMob服务器;
- 禁止在模拟器离线模式下测试,确保网络连接正常;
- 避免使用root/越狱设备测试,部分设备会被AdMob屏蔽。
5. 版本兼容性验证
检查react-native-google-mobile-ads与当前Expo SDK版本是否兼容,例如Expo SDK 49需对应插件版本^12.1.0以上,版本不匹配可能导致底层API调用失败。
内容的提问来源于stack exchange,提问作者Madhavan Suresh
相关产品推荐
相关产品推荐

