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

