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

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

4. 获取真机崩溃日志定位根源

  • Android:通过Android Studio的Logcat过滤AndroidRuntime或Ads关键词,查看具体崩溃堆栈信息
  • iOS:使用Xcode连接真机,查看崩溃报告中的异常详情,精准定位崩溃模块

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:50:33