React Native中Notifee自定义通知声音前台正常后台失效求助
解决React Native Notifee后台通知自定义声音不播放问题
一、通用代码优化
1. 仅初始化一次通知频道
Android通知频道一旦创建就无法修改(除非删除),每次调用通知都重复创建频道属于冗余操作,建议将频道初始化移到应用启动阶段,只执行一次:
修改App.js的初始化逻辑:
useEffect(() => { requestUserPermission(); getFCMToken(); // 初始化通知频道(仅执行一次) notifee.createChannel({ id: 'default', name: 'Default Channel', sound: 'customsound', vibration: true, vibrationPattern: [300, 500], importance: notifee.Importance.HIGH, // 高优先级确保后台声音正常播放 }); }, []);
简化onDisplayNotification函数,移除重复的频道创建代码:
export async function onDisplayNotification() { console.log('ondisplaynotification'); // iOS权限请求可移至初始化阶段,此处保留也可 await notifee.requestPermission(); console.log('sound playing'); await notifee.displayNotification({ title: 'Notification Title', body: 'Main body content of the notification', android: { sound: 'customsound', vibration: true, vibrationPattern: [300, 500], channelId: 'default', // 直接使用已初始化的频道ID priority: notifee.AndroidPriority.HIGH, // 后台通知强制高优先级 pressAction: { id: 'default', }, }, ios: { sound: 'customsound', // iOS自定义声音文件名(不带后缀) critical: true, // 锁屏/静音模式下强制播放声音(iOS 12+) }, }); }
二、Android平台专属配置
1. 自定义声音文件规范
- 将声音文件(如
customsound.mp3)放入android/app/src/main/res/raw目录 - 文件名必须全小写,禁止包含空格或特殊字符
- 支持格式:MP3、WAV、OGG
2. 系统权限与优化
- 在
AndroidManifest.xml中确认添加必要权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.VIBRATE" />
- 将应用加入系统电池优化白名单(部分厂商省电模式会限制后台通知声音)
三、iOS平台专属配置
1. 自定义声音文件配置
- 将声音文件(推荐
customsound.caf格式,体积小且兼容iOS)添加到Xcode项目 - 在
Build Phases->Copy Bundle Resources中确认文件已被包含 - 文件长度不超过30秒,文件名无空格
2. 后台模式开启
- 在Xcode的
Signing & Capabilities中添加Background Modes权限,勾选Remote notifications - 确保APNs推送payload包含
alert字段(仅content-available:1为静默推送,不会触发声音)
3. 系统权限检查
- 确认用户已开启应用通知声音权限:设置→应用→通知→声音
- 关闭iOS系统“勿扰模式”
四、后台消息处理注意事项
- Android的
setBackgroundMessageHandler运行在独立进程中,确保频道初始化逻辑在index.js中也能执行(后台进程启动时会加载index.js) - iOS的
setBackgroundMessageHandler执行时间限制在30秒内,避免在其中添加耗时操作,确保通知能快速显示
内容的提问来源于stack exchange,提问作者Munna Khandakar
相关产品推荐
相关产品推荐

