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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:00:47