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

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,目前无法定位故障原因
排查解决步骤

按优先级逐一验证:

  1. 校验基础配置一致性
    • 核对正式unitID对应的广告类型:插屏广告必须使用插屏类型的正式unitID,禁止混用横幅、激励视频、开屏广告的ID
    • 核对AdMob后台的应用ID和iOS项目Info.plist中配置的GADApplicationIdentifier值完全一致,多余空格、字符错漏都会导致正式ID请求失败,测试ID不受该问题影响
  2. 补全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逻辑保持不变
    }
    
  3. 修正广告实例初始化时机
    • 当前插屏广告实例在组件模块顶层创建,存在SDK未完成初始化就触发广告请求的问题,测试ID默认有兜底逻辑不会报错,正式ID会直接返回无效请求错误。需要把广告实例创建、load逻辑全部移到mobileAds().initialize()的成功回调内执行
  4. 补全iOS端必要配置
    • 确认Info.plist中已添加完整的SKAdNetworkItems配置项,缺少该配置时iOS14.5+正式广告请求会被拦截,测试ID无该限制
    • 确认Info.plist中已添加GADIsAdManagerApp字段,值设置为true
  5. 处理无填充场景
    • 新创建的广告单元、刚上架的新应用,前1-3天AdMob广告池匹配度低,会频繁出现无填充错误,属于正常现象,等自然用户流量积累后填充率会逐步上升
    • 禁止用测试设备频繁请求正式广告单元,会触发AdMob反作弊机制,直接拦截请求返回错误,正式ID验证必须使用真实自然用户流量场景
  6. 错误码对应定位
    • 若返回错误码1(无效请求):按前4步检查配置和代码逻辑即可解决
    • 若返回错误码3(无填充):属于流量匹配问题,无需修改代码,保持应用正常运营等待流量匹配即可

内容的提问来源于stack exchange,提问作者Nomura Nori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:01:26