React Native Expo集成Google AdMob报错:Invariant Violation原生组件异常
解决Expo环境下集成AdMob出现Invariant Violation的问题
早上好!我看你在Expo SDK环境里尝试用react-native-admob集成广告时碰到了「Invariant Violation: native component not found」的错误,这其实是Expo环境的特性导致的,我来给你讲清楚原因和解决办法:
问题根源
Expo Go(也就是你平时用的Expo默认客户端)是一个预打包的应用,只支持Expo官方维护的、不需要原生代码配置的库。而react-native-admob是一个依赖iOS/Android原生代码的第三方库,直接在Expo Go里运行的话,客户端找不到对应的原生组件实现,所以会抛出这个错误。
解决方案
方案一:使用Expo官方的AdMob库(推荐)
Expo有自己适配好的广告库expo-ads-admob,完全兼容Expo的托管工作流,不需要折腾原生配置,步骤如下:
- 先卸载你之前装的
react-native-admob:npm uninstall react-native-admob - 安装Expo官方的AdMob库:
npx expo install expo-ads-admob - 修改你的代码,替换成Expo的组件(用法和你之前的代码几乎一致):
import { AdMobBanner } from 'expo-ads-admob'; // ... render() { return ( <AdMobBanner adSize="fullBanner" adUnitID="ca-app-pub-123456789/12321312" testDevices={[AdMobBanner.simulatorId]} onAdFailedToLoad={error => console.error(error)} /> ); } - 重新启动项目:
npx expo start,用Expo Go打开就能正常加载广告了。
方案二:转为裸工作流使用react-native-admob
如果你一定要用react-native-admob这个库,那需要把Expo项目转为裸工作流(也就是生成原生项目文件),步骤如下:
- 执行预构建命令生成iOS/Android原生项目:
npx expo prebuild - 按照
react-native-admob的官方文档,分别配置iOS和Android的原生环境(比如在Info.plist里添加AdMob的App ID,在AndroidManifest.xml里配置权限等) - 最后用原生方式启动项目:
# iOS npx expo run:ios # Android npx expo run:android
额外注意
- 测试阶段记得使用AdMob的测试广告ID,避免触发真实广告的限制;
- 如果用方案一,确保你的Expo SDK版本和
expo-ads-admob版本兼容,可以查看Expo官方文档确认版本匹配情况。
内容的提问来源于stack exchange,提问作者oflcad
相关产品推荐
相关产品推荐

