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

React Native杀死状态下Firebase通知后台AsyncStorage等任务执行失败

解决React Native rnfirebase杀死状态下setBackgroundHandler不触发问题

核心原因:通知Payload必须包含data字段

应用处于杀死状态时,只有当Firebase通知携带data字段,系统才会将通知传递给setBackgroundMessageHandler处理。如果仅发送notification字段,系统会直接展示通知,不会触发自定义逻辑。

正确的推送Payload示例:

{
  "to": "你的设备Token",
  "data": {
    "title": "新消息",
    "body": "这是一条测试通知",
    "customData": "自定义内容"
  },
  "notification": {
    "title": "新消息",
    "body": "这是一条测试通知"
  }
}

确保setBackgroundMessageHandler在App启动时尽早注册

handler必须在App组件注册前定义,不能放在组件内部(比如useEffect里),否则杀死状态下无法被系统唤起。示例代码:

import { AppRegistry, Platform } from 'react-native';
import messaging from '@react-native-firebase/messaging';
import AsyncStorage from '@react-native-async-storage/async-storage';
import Notifications from '@react-native-firebase/notifications';
import App from './App';
import { name as appName } from './app.json';

// 后台通知处理逻辑 - 必须在App注册前执行
messaging().setBackgroundMessageHandler(async remoteMessage => {
  console.log('后台通知触发:', remoteMessage);
  
  // 写入AsyncStorage
  await AsyncStorage.setItem('latestNotification', JSON.stringify(remoteMessage));
  
  // 更新应用角标
  if (Platform.OS === 'ios') {
    const currentBadge = await Notifications.getBadgeCount();
    await Notifications.setBadgeCount(currentBadge + 1);
  } else {
    // Android可使用react-native-badge等第三方库或系统API实现角标更新
  }
});

AppRegistry.registerComponent(appName, () => App);

平台特定配置检查

iOS

  1. 在Xcode中开启Remote notifications后台模式:
    • 打开项目 -> Signing & Capabilities -> 点击+ Capability -> 添加Background Modes -> 勾选Remote notifications
  2. 确保推送证书和APNs配置正确,推送的apns-push-type设置为alert(前台/后台通知)或background(静默通知)

Android

  1. 检查AndroidManifest.xml中是否正确注册Firebase Messaging服务:
<service
  android:name="io.invertase.firebase.messaging.RNFirebaseMessagingService"
  android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>
  1. Android 12+需动态请求POST_NOTIFICATIONS权限:
import { PermissionsAndroid } from 'react-native';

async function requestNotificationPermission() {
  if (Platform.OS === 'android' && Platform.Version >= 33) {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS,
      {
        title: '通知权限',
        message: '需要权限展示通知',
        buttonNeutral: '稍后',
        buttonNegative: '取消',
        buttonPositive: '允许',
      }
    );
    return granted === PermissionsAndroid.RESULTS.GRANTED;
  }
  return true;
}

测试注意事项

  • iOS必须用真机测试杀死状态下的推送,模拟器不支持该场景
  • Android可通过Firebase控制台或adb命令发送测试通知,确保携带data字段
  • 升级rnfirebase到最新稳定版本,旧版本可能存在杀死状态下handler不触发的bug

内容的提问来源于stack exchange,提问作者Hardik Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:25:06