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

React Native集成Google AdMob激励广告时广告未加载/加载失败导致应用崩溃的问题求助

React Native集成Google AdMob激励广告时广告未加载/加载失败导致应用崩溃的问题求助

我在React Native项目里通过Google AdMob集成了激励广告,但目前遇到一个棘手的问题:在广告还未完成加载的情况下触发展示操作,会直接导致应用崩溃。

已尝试的解决措施

  • 我给广告展示逻辑加了1秒的setTimeout延迟,确实大幅减少了崩溃次数,但这明显不是长久之计,而且我至今没搞清楚问题的根源到底是什么。
  • 我试过用useState的loaded状态来判断广告是否加载完成,但这个方案完全无效:
    useEffect(() => {
      console.log('ads loaded', loaded)
    }, [loaded])
    
    这段代码只执行了一次,输出的loaded值始终是false,但延迟后我明明能正常看到广告展示,说明这个状态根本没正确捕获到广告加载完成的事件。

完整代码

import {
  RewardedAd,
  TestIds,
  AdEventType,
  RewardedAdEventType
} from 'react-native-google-mobile-ads';

const adUnitId = __DEV__ ? TestIds.REWARDED
  : 'ca-app-pub-xxxxxxxxxxxxxxxxxxx';

const rewarded = RewardedAd.createForAdRequest(adUnitId, {
  requestNonPersonalizedAdsOnly : false,
  keywords: ['finance', 'Accounting'],
});

const AdScreen = ({ navigation }) => {
  const [loaded, setLoaded] = useState(false);
  const adRewardEarnedRef = useRef(null)

  useEffect(() => {
    const unsubscribeLoaded = rewarded.addAdEventListener(
      RewardedAdEventType.LOADED,
      () => {
        setLoaded(true);
      },
    );

    const unsubscribeEarned = rewarded.addAdEventListener(
      RewardedAdEventType.EARNED_REWARD,
      () => {
        adRewardEarnedRef.current = 'earned'
      },
    );

    const unsubscribeAdsClosed = rewarded.addAdEventListener(
      AdEventType.CLOSED,
      () => {
        if (adRewardEarnedRef.current != null) {
          setTimeout(() => {
            setBottomModalVisible(true)
          }, 500)
        }
      }
    )

    const unsubscribeAdsFailedToLoad =
      rewarded.addAdEventListener(
        AdEventType.ERROR,
        () => {
          console.log('error')
          // 这个回调没拿到有效报错信息,只有用户未授权时能触发
        }
      )

    rewarded.load();

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

  const watchAdToDownload = () => {
    setModalVisible(false)
    setTimeout(() => {
      rewarded.show()
    },1000)
  }

  const handleNavigateToGoPro = () => {
    setModalVisible(false)
    navigation.navigate("GoProScreen")
  }

  const handleDownloadButton = () => {
    if (paidUser) {
      return setBottomModalVisible(true)
    }
    if (adRewardEarnedRef.current != null) {
      return setBottomModalVisible(true)
    }
    setModalVisible(true)
  }
}

求助问题

有没有大佬能帮忙分析下问题出在哪里?怎么才能彻底解决这个崩溃问题?

另外我还有个想法:能不能采用预加载的方式?比如在上一个页面就提前加载好广告,跳转到当前页面后直接展示,这种方案可行吗?如果可行的话,应该怎么实现?

备注:内容来源于stack exchange,提问作者abic17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:19:33