You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.caf
    
    把转换好的文件放到项目的assets/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

火山引擎 最新活动