Expo React Native应用iOS和Android端推送通知自定义提示音与振动的技术问询
Expo React Native应用iOS和Android端推送通知自定义提示音与振动的技术问询
嘿,我来帮你搞定Expo React Native里自定义推送通知声音和振动的问题!我自己在项目里折腾过这些配置,分iOS和Android给你一步步讲清楚~
一、自定义通知提示音
1. 先准备符合要求的音频文件
两个平台对音频格式的要求不一样,得提前处理好:
- iOS:必须是
.caf格式,你可以用mac自带的afconvert工具转换,比如把mp3转成caf的命令:
把转换好的文件放到项目的afconvert -f caff -d LEI16@44100 -c 1 your-sound.mp3 custom-sound.cafassets/sounds目录下,然后在app.json里把这个目录添加到资源配置里,这样Expo才能打包进去:{ "expo": { "assets": ["./assets/sounds/"] } } - Android:支持
.mp3、.wav格式,直接把音频文件放到assets/sounds目录就行,不需要额外配置资源路径,记好文件名就行。
2. 在推送Payload里指定声音
不管你用Expo官方的推送服务还是自己的后端,都要在推送的Payload里加上声音字段:
比如用Expo推送API的话,Payload可以这么写:
{ to: '你的Expo推送Token', sound: 'custom-sound.caf', // iOS用这个文件名,Android换成对应的.mp3/.wav文件名 title: '自定义通知', body: '这是一条带专属提示音的通知' }
⚠️ 注意:iOS上只有前台或锁屏状态下的通知才会播放自定义声音,静默通知或者后台通知不会触发;Android要确保用户已经给了通知权限,不然声音可能不生效。
二、自定义振动模式
1. Android端实现
Android对振动的支持比较灵活,直接在Payload里加vibrate字段就行,这个字段是一个数组,每一项代表振动/暂停的毫秒数,比如[100, 200, 100, 500]就是:振100ms → 停200ms → 振100ms → 停500ms:
{ to: '你的Expo推送Token', vibrate: [100, 200, 100, 500], title: '自定义振动通知', body: '这是一条带专属振动节奏的通知' }
如果你想在应用内监听通知时手动触发振动,也可以用Expo的Vibration模块:
import { Vibration } from 'react-native'; import * as Notifications from 'expo-notifications'; // 监听通知到达事件 Notifications.addNotificationReceivedListener(notification => { // 触发自定义振动模式 Vibration.vibrate([100, 200, 100, 500]); });
2. iOS端实现
iOS的振动限制比较多,系统默认的通知振动是和声音绑定的,开启通知权限后就会有。如果想要完全自定义振动模式,目前Expo没有直接暴露对应的API,因为iOS要求自定义振动需要用户在系统设置里配置,或者用原生的UserNotifications框架实现。如果你的需求必须要自定义振动,建议用EAS构建项目,然后添加少量原生代码来实现;如果只是要伴随通知振动,配合自定义声音的默认振动基本能满足需求。
三、必看的注意事项
- 不管是声音还是振动,都要先确保用户给了应用通知权限,你可以用
Notifications.getPermissionsAsync()来检查和请求权限。 - iOS的自定义声音文件不能超过30秒,不然系统会直接忽略这个声音。
- Android 13及以上版本,需要单独请求
POST_NOTIFICATIONS权限,不然通知可能根本不显示。
备注:内容来源于stack exchange,提问作者ktRAW1574




