React Native iOS生产环境AdMob正式广告无法加载展示
问题描述
- 当前项目接入广告依赖版本:
"react-native-google-mobile-ads": "^6.3.0" - 此前项目使用
expo-ads-admob时广告功能运行正常,该库1个月前被官方标记废弃,官方推荐迁移至react-native-google-mobile-ads,目前已完成全部迁移工作。 - 迁移后测试现象:
- 使用测试unitID时,模拟器、TestFlight、真机设备环境下广告均可正常加载展示
- 切换为生产环境正式unitID时广告无法展示,抛出对应错误

- 项目相关实现代码:
App.tsx
export default function App() { useEffect(() => { request(PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY) mobileAds() .initialize() .then(adapterStatuses => { console.info('=== adapter ===', JSON.stringify(adapterStatuses, null, 4)) // Initialization complete! }) .catch(err => { console.info('=== err ===', JSON.stringify(err, null, 4)) }); }, []) ...Admob.tsx
const interestialAd = InterstitialAd.createForAdRequest(unitId); // demo unitId works, but real unitId not working export const CustomAdMob = (props) => { const [loaded, setLoaded] = useState(false); useEffect(() => { const unsubscribe = interestialAd.addAdEventListener(AdEventType.CLOSED, () => { setLoaded(false) interestialAd.load(); }); return () => { unsubscribe() }; }, []); useEffect(() => { if (loaded) { interestialAd.show() } }, [loaded]) ... - 已确认信息:
- AdMob账号与对应广告单元均创建于20天前,账号付款信息已完成验证
- 控制台显示应用状态为
ready,不存在隐私合规类问题
- 对应iOS应用已正式发布上架App Store,目前无法定位故障原因
排查解决步骤
按优先级逐一验证:
- 校验基础配置一致性
- 核对正式unitID对应的广告类型:插屏广告必须使用插屏类型的正式unitID,禁止混用横幅、激励视频、开屏广告的ID
- 核对AdMob后台的应用ID和iOS项目
Info.plist中配置的GADApplicationIdentifier值完全一致,多余空格、字符错漏都会导致正式ID请求失败,测试ID不受该问题影响
- 补全ATT权限适配逻辑
- 当前代码仅申请了ATT权限,但未根据用户授权结果调整广告请求参数,iOS14.5+版本如果用户拒绝跟踪权限,请求正式广告时必须标记为非个性化广告,否则会直接返回请求错误
- 调整广告请求代码:
import { AdsConsent, InterstitialAd, AdEventType } from 'react-native-google-mobile-ads'; // 放在SDK初始化完成回调内执行 const initAd = async () => { const consentInfo = await AdsConsent.requestInfoUpdate(); const interestialAd = InterstitialAd.createForAdRequest(unitId, { requestNonPersonalizedAdsOnly: consentInfo.status === 'DENIED' }); // 后续事件监听、load逻辑保持不变 } - 修正广告实例初始化时机
- 当前插屏广告实例在组件模块顶层创建,存在SDK未完成初始化就触发广告请求的问题,测试ID默认有兜底逻辑不会报错,正式ID会直接返回无效请求错误。需要把广告实例创建、load逻辑全部移到
mobileAds().initialize()的成功回调内执行
- 当前插屏广告实例在组件模块顶层创建,存在SDK未完成初始化就触发广告请求的问题,测试ID默认有兜底逻辑不会报错,正式ID会直接返回无效请求错误。需要把广告实例创建、load逻辑全部移到
- 补全iOS端必要配置
- 确认
Info.plist中已添加完整的SKAdNetworkItems配置项,缺少该配置时iOS14.5+正式广告请求会被拦截,测试ID无该限制 - 确认
Info.plist中已添加GADIsAdManagerApp字段,值设置为true
- 确认
- 处理无填充场景
- 新创建的广告单元、刚上架的新应用,前1-3天AdMob广告池匹配度低,会频繁出现无填充错误,属于正常现象,等自然用户流量积累后填充率会逐步上升
- 禁止用测试设备频繁请求正式广告单元,会触发AdMob反作弊机制,直接拦截请求返回错误,正式ID验证必须使用真实自然用户流量场景
- 错误码对应定位
- 若返回错误码1(无效请求):按前4步检查配置和代码逻辑即可解决
- 若返回错误码3(无填充):属于流量匹配问题,无需修改代码,保持应用正常运营等待流量匹配即可
内容的提问来源于stack exchange,提问作者Nomura Nori
相关产品推荐
相关产品推荐

