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中的正常现象
疑问
- TestFlight中(应用审核期间)不显示真实广告是否属于正常行为?
- 应用上架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
相关产品推荐
相关产品推荐

