Expo开发安卓推送通知仅振动,无声音及弹窗问题求助
解决Expo Android推送通知仅振动、无声音无弹窗的问题
针对你遇到的问题,结合你的代码和环境(Android 9、Expo SDK 37、Laravel服务端),下面是几个排查和解决的关键点:
1. 修正Android通知频道的配置
你已经创建了通知频道,但有几个细节需要调整:
priority参数在Expo的createChannelAndroidAsync中,正确取值应为数字而非字符串:max对应数字2,字符串类型的priority可能不生效,导致通知优先级不足无法弹出。- 建议将
sound参数指定为default(系统默认通知声),部分设备对布尔值的支持不够稳定;同时新增importance参数,这是Android 8.0+控制通知是否弹出的核心配置。
修正后的客户端频道创建代码:
if (Platform.OS === 'android') { await Notifications.createChannelAndroidAsync('notification-sound-channel', { name: 'Notification Sound Channel', sound: 'default', // 使用系统默认通知声,也可指定自定义音频文件 priority: 2, // 对应max优先级,确保通知能弹出横幅 vibrate: [0, 250, 250, 250], importance: Notifications.AndroidImportance.MAX, // 强制通知弹出横幅 }); }
2. 完善服务端通知Payload
你的服务端代码已指定channelId,但还需补充以下配置:
- 明确设置
sound字段为default,避免仅依赖频道配置导致声音不触发 - 在
android字段中重复指定channelId和priority,确保通知优先级足够
修正后的Laravel服务端代码:
$notification = [ 'title' => 'test title', 'body' => 'test body', 'channelId' => 'notification-sound-channel', 'sound' => 'default', // 明确指定通知声音 'android' => [ 'priority' => 'high', // 提升通知优先级 'channelId' => 'notification-sound-channel', // 再次绑定频道,避免配置遗漏 ], ];
3. 检查设备的应用通知权限
即使代码中请求了NOTIFICATIONS权限,Android 9设备仍需手动确认细分权限:
- 打开设备「设置」→「应用和通知」→ 找到你的应用 →「通知」
- 确保「允许通知」开启,同时对应频道(Notification Sound Channel)下的「声音」「弹窗通知」都已启用
部分场景下,用户仅授予了基础通知权限,但频道的声音和弹窗权限默认处于关闭状态。
4. 验证Expo SDK版本兼容性
你提到的expo版本 "^37.0.8"和SDK版本27存在版本冲突:Expo SDK 37对应的expo包版本就是37.x,而SDK27是非常老旧的版本(对应expo 27.x)。建议统一项目的SDK版本,优先使用稳定的37.x版本,避免版本不兼容导致的通知异常。
测试验证
修改配置后,重启Expo项目或重新打包安装应用,再用Expo推送工具测试:
- 确认推送Payload包含正确的
channelId和sound字段 - 若问题仍存在,可尝试删除应用后重新安装,确保新的通知频道被正确创建
内容的提问来源于stack exchange,提问作者Shady Hakim




