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

如何在React Native Firebase安卓设备静音/DND时播放警报推送音

安卓端实现iOS Critical级推送的方案(React Native Firebase)

一、服务端FCM推送JSON结构

要实现设备静音/DND时仍能播放警报音,需结合FCM高优先级设置、自定义声音,配合APP端的通知渠道配置。以下是两种常用Payload结构:

1. 基础通知Payload(直接触发系统通知)

{
  "message": {
    "token": "ANDROID_DEVICE_TOKEN",
    "notification": {
      "title": "xxxx",
      "body": "yyyyy",
      "sound": "alarm.mp3" // 自定义音频文件名,需提前放入安卓项目res/raw目录
    },
    "android": {
      "priority": "high",
      "notification": {
        "channel_id": "critical_alarm_channel", // 必须与APP端创建的渠道ID一致
        "sound": "alarm.mp3"
      }
    },
    "apns": {
      // 保留原有iOS Critical推送配置
      "headers": {
        "apns-priority": "10",
        "apns-push-type": "alert"
      },
      "payload": {
        "aps": {
          "alert": {
            "title": "xxxx",
            "body": "yyyyy"
          },
          "sound": {
            "critical": 1,
            "name": "alarm.mp3",
            "volume": 1.0
          }
        }
      }
    }
  }
}

2. 自定义Data Payload(APP端自行处理通知展示)

如果需要更灵活的控制,可通过Data Payload让APP端接管通知创建:

{
  "message": {
    "token": "ANDROID_DEVICE_TOKEN",
    "data": {
      "title": "xxxx",
      "body": "yyyyy",
      "sound": "alarm.mp3",
      "type": "critical_alarm"
    },
    "android": {
      "priority": "high"
    },
    "apns": {
      // 原iOS配置不变
      "headers": {
        "apns-priority": "10",
        "apns-push-type": "alert"
      },
      "payload": {
        "aps": {
          "alert": {
            "title": "xxxx",
            "body": "yyyyy"
          },
          "sound": {
            "critical": 1,
            "name": "alarm.mp3",
            "volume": 1.0
          }
        }
      }
    }
  }
}

二、React Native Firebase APP端处理方案

1. 创建高优先级通知渠道(安卓8.0+必备)

在APP初始化阶段创建支持绕过DND的通知渠道:

import messaging from '@react-native-firebase/messaging';
import { Platform } from 'react-native';

const createCriticalAlarmChannel = async () => {
  if (Platform.OS !== 'android') return;

  const channel = new messaging.NotificationChannel('critical_alarm_channel', '紧急警报', {
    importance: messaging.Importance.HIGH, // 设置最高优先级
    sound: 'alarm.mp3', // 关联自定义音频
    bypassDnd: true, // 允许绕过免打扰模式
    vibrationPattern: [0, 250, 250, 250], // 可选:设置震动模式
    lockscreenVisibility: messaging.Visibility.PUBLIC, // 锁屏可见
  });

  await messaging().setNotificationChannel(channel);
};

// APP启动时调用
useEffect(() => {
  createCriticalAlarmChannel();
}, []);

2. 处理后台/杀死状态下的通知

如果使用Data Payload,需在index.js中配置消息处理逻辑:

import messaging from '@react-native-firebase/messaging';

messaging().setBackgroundMessageHandler(async remoteMessage => {
  if (remoteMessage.data.type === 'critical_alarm') {
    // 手动创建通知
    await messaging().displayNotification({
      title: remoteMessage.data.title,
      body: remoteMessage.data.body,
      android: {
        channelId: 'critical_alarm_channel',
        sound: 'alarm.mp3',
      },
    });
  }
});

3. 自定义音频文件放置

将alarm.mp3放入安卓项目的android/app/src/main/res/raw目录(无raw文件夹则手动创建),注意文件名不能包含大写字母或特殊字符。

关键注意事项

  • 安卓系统限制:只有最高优先级的通知渠道才能绕过DND,必须确保渠道importance设为HIGH或MAX。
  • 权限验证:需确保APP已获取通知权限,可通过messaging().requestPermission()申请。
  • 测试场景:切换设备到静音/DND模式后发送推送,验证警报音是否正常播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:12:43