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

React Native(Expo)替换AdMob生产AdUnit ID后TestFlight无广告显示

AdMob集成问题:生产AdUnit ID在TestFlight/Expo Go中无广告显示

背景

我用Expo和react-native-google-mobile-ads在React Native应用里集成了AdMob。本地用测试AdUnit ID(ca-app-pub-3940256099942544/6978759866)时,模拟器里广告显示正常,但切换成AdMob提供的生产AdUnit ID(ca-app-pub-xxx/xxx)并通过Expo构建后,Expo Go和TestFlight里都看不到广告。

配置信息

app.json配置

{
  "expo": {
    ...
    "plugins": [
      [
        "react-native-google-mobile-ads",
        {
          "androidAppId": "ca-app-pub-xxx~xxx",
          "iosAppId": "ca-app-pub-xxx~xxx"
        }
      ]
    ],
    "ios": {
      ...
      "infoPlist": {
        "SKAdNetworkItems": [
          {
            "SKAdNetworkIdentifier": [
              "cstr6suwn9.skadnetwork",
              "4fzdc2evr5.skadnetwork",
              ...
            ]
          }
        ]
      }
    }
  }
}

AdMob组件代码

import { RewardedInterstitialAd, RewardedAdEventType, TestIds, AdEventType } from 'react-native-google-mobile-ads';
import React, { useEffect, useState } from 'react';
import { View, StyleSheet } from 'react-native';

const adUnitId = 'ca-app-pub-xxx/xxx'; // Production Ad Unit ID

const rewardedInterstitial = RewardedInterstitialAd.createForAdRequest(adUnitId, {
  requestNonPersonalizedAdsOnly: true,
  keywords: ['fashion', 'clothing'],
});

const RewardedInterstitialAdComponent = () => {
  const [loaded, setLoaded] = useState(false);

  useEffect(() => {
    const unsubscribeLoaded = rewardedInterstitial.addAdEventListener(RewardedAdEventType.LOADED, () => {
      console.log('Ad loaded');
      setLoaded(true);
    });

    const unsubscribeEarned = rewardedInterstitial.addAdEventListener(RewardedAdEventType.EARNED_REWARD, (reward) => {
      console.log('User earned reward', reward);
    });

    const unsubscribeClosed = rewardedInterstitial.addAdEventListener(AdEventType.CLOSED, () => {
      rewardedInterstitial.load();
    });

    rewardedInterstitial.load();

    return () => {
      unsubscribeLoaded();
      unsubscribeEarned();
      unsubscribeClosed();
    };
  }, []);

  if (!loaded) {
    return null;
  }

  rewardedInterstitial.show();

  return <View style={styles.container} />;
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

export default RewardedInterstitialAdComponent;

已知问题

  • 本地测试AdUnit ID在模拟器中广告显示正常
  • 切换生产AdUnit ID后,TestFlight和生产构建的Expo Go中均无广告显示
  • 已确认app.json和AdMob控制台的AdUnit ID完全一致
  • 不确定是配置问题还是TestFlight中的正常现象

疑问

  1. TestFlight中(应用审核期间)不显示真实广告是否属于正常行为?
  2. 应用上架App Store后广告是否会正常工作,还是我遗漏了某些配置?

解答

关于TestFlight中无真实广告的问题

这是正常现象。AdMob会自动限制测试环境(包括TestFlight构建)中的真实广告投放,核心目的是避免无效点击干扰广告收益统计,同时防止测试行为触发政策违规。TestFlight环境下即便配置生产AdUnit ID,也只会返回测试广告或无广告填充。

上架后的广告是否正常

只要完成以下配置,上架App Store后广告应该能正常工作:

  • 确认AdMob控制台中,应用ID(ca-app-pub-xxx~xxx)与app.json里配置的androidAppId/iosAppId完全匹配
  • 确认生产AdUnit ID已关联到对应应用,且AdMob控制台中该应用状态为已批准(未批准的应用无法投放真实广告)
  • iOS端SKAdNetworkItems配置完整(当前配置已包含AdMob核心SKAdNetwork ID,确保无遗漏)
  • 确认应用未违反AdMob政策,否则上架后仍可能被限制广告投放

额外检查点

  • 可以在生产构建中添加广告加载失败监听,通过日志排查具体问题:
    const unsubscribeFailed = rewardedInterstitial.addAdEventListener(AdEventType.FAILED_TO_LOAD, (error) => {
      console.log('Ad failed to load:', error);
    });
    
    失败日志会明确原因,比如广告填充不足、配置错误等。
  • Expo Go属于测试环境,和TestFlight一样,仅支持测试AdUnit ID,无法加载生产广告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:05:57