React Native中AdMob激励广告真机崩溃问题求助
React Native Google Mobile Ads 激励广告真机崩溃问题排查与解决方案
问题现象
- 模拟器中Google Mobile Ads测试激励广告运行正常
- 个人真机测试时,激励广告无法加载且触发应用崩溃,仅横幅广告可正常运行
排查与解决步骤
1. 确认真机测试设备配置
即使使用AdMob测试ID,部分真机仍需在AdMob后台注册为测试设备,避免触发AdMob的流量限制导致崩溃:
- Android:通过Logcat搜索
Ads关键词,找到包含Use AdRequest.Builder.addTestDevice("DEVICE_ID")的日志,复制设备ID后添加到AdMob后台的测试设备列表 - iOS:通过Xcode控制台搜索
Ads关键词,获取设备ID并完成测试设备注册
2. 优化激励广告的初始化与生命周期管理
当前代码中RewardedAd实例在组件外部创建,易引发实例重复、清理不及时等问题。建议调整为组件内部管理:
import React, { useState, useEffect, useRef } from "react"; import { View, Button, Text, ScrollView } from 'react-native' import { RewardedAd, RewardedAdEventType, TestIds } from 'react-native-google-mobile-ads'; const adUnitId = __DEV__ ? TestIds.REWARDED : 'ca-app-pub-3940256099942544/5224354917'; const Testing = ({ navigation }) =>{ const [loaded, setLoaded] = useState(false); const rewardedAdRef = useRef(null); useEffect(() => { // 组件内部创建广告实例 rewardedAdRef.current = RewardedAd.createForAdRequest(adUnitId, { requestNonPersonalizedAdsOnly: true, keywords: ['fashion', 'clothing'], }); // 监听广告加载成功事件 const unsubscribeLoaded = rewardedAdRef.current.addAdEventListener(RewardedAdEventType.LOADED, () => { setLoaded(true); rewardedAdRef.current.show(); }); // 监听奖励获取事件 const unsubscribeEarned = rewardedAdRef.current.addAdEventListener( RewardedAdEventType.EARNED_REWARD, reward => { console.log('User earned reward of ', reward); }, ); // 监听加载失败事件,便于排查问题 const unsubscribeFailed = rewardedAdRef.current.addAdEventListener( RewardedAdEventType.FAILED_TO_LOAD, error => { console.error('Ad failed to load:', error); setLoaded(false); }, ); // 启动广告加载 rewardedAdRef.current.load(); // 组件卸载时清理事件监听与广告实例 return () => { unsubscribeLoaded(); unsubscribeEarned(); unsubscribeFailed(); if (rewardedAdRef.current) { rewardedAdRef.current.destroy(); } }; }, []); return ( <ScrollView> <View style={{flex:1, justifyContent : 'center',alignItems : 'center'}}> <Text> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, </Text> <Button onPress={() => navigation.navigate('First')} title='Next Screen'></Button> </View> </ScrollView> ) } export default Testing;
- 使用
useRef保存广告实例,确保组件卸载时能正确销毁 - 添加
FAILED_TO_LOAD事件监听,快速定位加载失败原因 - 将实例创建移至组件内部,避免全局实例引发的状态冲突
3. 验证依赖与原生配置
- 更新
react-native-google-mobile-ads至最新稳定版:npm update react-native-google-mobile-ads # 或使用yarn yarn upgrade react-native-google-mobile-ads - 检查原生平台配置:
- Android:确认
AndroidManifest.xml中已添加AdMob应用ID元数据及INTERNET权限 - iOS:确认
Info.plist中已配置AdMob应用ID,若使用个性化广告需添加NSUserTrackingUsageDescription
- Android:确认
4. 获取真机崩溃日志定位根源
- Android:通过Android Studio的Logcat过滤
AndroidRuntime或Ads关键词,查看具体崩溃堆栈信息 - iOS:使用Xcode连接真机,查看崩溃报告中的异常详情,精准定位崩溃模块
内容的提问来源于stack exchange,提问作者Rahul Aadam
相关产品推荐
相关产品推荐

