Expo推送通知无声音:使用expo-notifications无系统提示音如何解决
通知无声音问题原因及解决方案
核心原因
绝大多数情况是以下几类配置错误导致:
- Android通知通道创建后不可修改,前期测试生成的旧通道没有声音配置,后续修改代码不会更新已存在的通道参数
- 推送请求载荷未携带
sound参数,或者Android端未指定对应通知通道ID - 系统通知权限的声音开关未打开,或设备处于静音/免打扰/专注模式
- iOS端未显式申请声音权限
分步修复方案
1. 清理旧的Android通知通道
完全卸载设备上已安装的测试应用,再重新安装运行,确保新的通道配置生效。Android系统通知通道一旦创建,后续哪怕修改代码参数也不会更新已有通道配置,必须卸载重装或者更换通道ID才能生效。
你的通道创建代码本身没有问题,importance设为MAX、sound设为'default'已经满足出声音的要求。如果不想卸载应用,可以把代码里的通道ID从'default'改成其他值比如'default_v2',同时后续推送请求里的channelId同步修改即可。
2. 配置推送请求的载荷参数
无论你使用Expo官方推送服务还是自研后端发送推送,都必须在请求里添加声音相关配置,否则默认不会播放提示音:
Expo Push服务请求示例
{ "to": "你的Expo推送Token", "sound": "default", "title": "通知标题", "body": "通知内容", "android": { "channelId": "default" } }
FCM(安卓自建推送)请求示例
{ "android": { "notification": { "sound": "default", "channel_id": "default" } } }
APNs(iOS自建推送)请求示例
{ "aps": { "sound": "default", "alert": { "title": "通知标题", "body": "通知内容" } } }
3. 补全权限申请配置
在申请通知权限的代码中显式指定需要声音权限,避免部分系统默认关闭声音权限:
const { status } = await Notifications.requestPermissionsAsync({ ios: { allowAlert: true, allowSound: true, allowBadge: true, }, android: {}, })
同时确认app.json中已添加安卓13+所需的通知权限:
{ "expo": { "android": { "permissions": ["POST_NOTIFICATIONS"] } } }
4. 验证系统设置
- 检查设备是否处于静音、免打扰、专注模式,关闭后再测试
- 进入系统设置的应用通知管理页,确认对应应用的通知声音开关处于打开状态
内容的提问来源于stack exchange,提问作者MrNexiol
相关产品推荐
相关产品推荐

