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
相关产品推荐
相关产品推荐

