如何实现自定义通知铃声

目前阿里云自有通道以及部分厂商通道支持自定义通知铃声。通过在创建应用通知通道时设定铃声路径,用户可以指定此通知通道所使用的通知铃声。本文为您提供移动推送实现自定义通知铃声的教程。

各通道支持情况

分类

通道列表

备注

支持自定义铃声的通道

  • 阿里云自有通道

  • 华为通道

  • 小米通道

  • OPPO通道

  • FCM通道

  • APNs通道

  • 阿里云自有通道通知在小米机型上不支持自定义铃声。

  • 华为通道可以通过在第一次推送服务与通讯通知时下发铃声路径字段实现自定义铃声。对于数据处理位置为海外的应用还可以通过自定义channel的方式实现自定义铃声。

  • 小米通道可以通过自定义channel的方式实现自定义铃声,自定义channel需要去小米推送运营平台上申请。

  • OPPO通道仅支持2024.11.20之前开启Opush推送服务的应用在推送私信通知时自定义铃声。推送私信通知需要去OPush推送运营平台申请。

不支持自定义铃声的通道

  • vivo通道

  • 荣耀通道

  • 魅族通道

安卓自定义铃声

阿里云自有通道自定义铃声实现

安卓8.0以上版本可以在客户端创建自定义通知通道时指定铃声。

操作步骤如下:

1. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

2. 在客户端创建自定义通知通道

在创建通知通道时通过调用setSound()给通知通道指定铃声。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // 通知通道的id。
    String channelId = "${channel_id}"; // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
    // 用户可以看到的通知通道的名字。
    CharSequence name = "${通道描述}";
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = new NotificationChannel(channelId, 
                                          name, importance);
    // 配置通知通道的属性。
    //  自定义铃声
    mChannel.setSound(Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.alicloud_notification_sound), Notification.AUDIO_ATTRIBUTES_DEFAULT);
    // 最后在notificationmanager中创建该通知通道。
    mNotificationManager.createNotificationChannel(mChannel);
}
3. 服务端推送通知时参数配置

服务端推送通知时配置参数AndroidNotificationChannel。

AndroidNotificationChannel字段说明如下:

名称

类型

描述

AndroidNotificationChannel

string

服务端推送时配置参数AndroidNotificationChannel赋值channel_idAndroid端创建通知时channel_id)。

关于AndroidNotificationChannel的更多描述可以跳转Push - 高级推送查看。

服务端在推送通知时需要根据步骤2中创建的通知通道的channel_Id设置参数。示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidNotificationChannel("${channel_id}"); // 设置channel id
...
重要
  • 在客户端创建通道时小米机型调用setSound()指定铃声无效,因此阿里云自有通道自定义铃声不支持小米机型。

  • 铃声是通知通道的属性。通知通道一旦创建后推送消息的铃声为创建该通道时的铃声,后续将无法修改。

华为通道自定义铃声实现

华为通道提供了两种自定义铃声的实现方式,方式一是通过首次给应用推送服务与通讯消息时携带铃声路径字段实现,方式二是通过自定义通知通道实现,其中方式二仅支持数据处理位置为海外的应用,不支持数据处理位置为中国区的应用。

方式一:首次给应用推送服务与通讯消息时携带铃声路径字段

2023年2月28日起,华为发布了《华为消息分类调整通知》,将EMUI 10.0以上系统的推送消息分为了服务与通讯以及资讯营销两类。

huawei_message_catagory

其中,服务与通讯类消息通过铃声提醒,而资讯营销类消息静默通知。

消息类型

提醒方式

推送数量限制

服务与通讯

锁屏、铃声、振动

无限制

资讯营销

静默通知,仅在通知栏展示消息

根据应用类别限制每日推送数量,具体要求参见《推送数量管理细则》

通过在首次给应用推送服务与通讯类消息时携带铃声路径字段,用户可以自定义通知铃声。

操作步骤如下:

1. 为应用申请服务与通讯类的自分类权益

根据华为《自分类权益申请》为您的应用申请服务与通讯类消息的自分类权益。

2. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

3. 服务端首次推送服务与通讯类通知参数配置

服务端推送通知时配置参数AndroidMusic与AndroidMessageHuaweiCategory。

AndroidMusic与AndroidMessageHuaweiCategory字段说明如下:

名称

类型

描述

AndroidMusic

string

华为厂商通道通知声音。指定存放在客户端项目app/src/main/res/raw/目录下的音频文件名,不需要携带文件格式后缀名。

若不设置,则使用默认铃声。

AndroidMessageHuaweiCategory

string

申请的自分类权益的消息类型所对应的云端通知category取值,例如您申请的消息类型是工作事项提醒,那么对应的云端通知category取值就是WORK,具体对应关系请见《消息分类标准》

关于AndroidMusic与AndroidMessageHuaweiCategory的更多描述可以跳转Push - 高级推送查看。

在首次推送服务与通讯通知时,您需要调用setAndroidMusic()设置铃声,参数为客户端铃声文件的名称,不需要携带文件格式后缀名。同时您需要根据步骤1中申请的自分类权益的消息类型设置其云端通知category取值。示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidMusic("alicloud_notification_sound"); // /raw/目录下的铃声路径,不需要携带文件格式后缀名
pushRequest.setAndroidMessageHuaweiCategory("WORK"); // 步骤1中申请的自分类权益的消息类型的云端通知category取值
...
重要

必须是在首次推送服务与通讯类消息时携带铃声路径字段才能自定义通知铃声,通知通道一旦创建后推送消息的铃声为创建该通道时的铃声,后续将无法修改。

方式二:自定义通知通道

华为通道给海外应用提供了自定义通知通道的能力。用户可以在客户端创建自定义通知通道,通过给通知通道设置铃声路径属性来自定义通知铃声。

操作步骤如下:

1. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

2. 在客户端创建自定义通知通道

在创建通知通道时通过调用setSound()给通知通道指定铃声。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // 通知通道的id。
    String channelId = "${channel_id}"; // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
    // 用户可以看到的通知通道的名字。
    CharSequence name = "${通道描述}";
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
    // 配置通知通道的属性。
    //  自定义铃声
    mChannel.setSound(Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.alicloud_notification_sound), Notification.AUDIO_ATTRIBUTES_DEFAULT);
    // 最后在notificationmanager中创建该通知通道。
    mNotificationManager.createNotificationChannel(mChannel);
}
3. 服务端推送通知时参数配置

服务端推送通知时配置参数AndroidNotificationChannel与AndroidNotificationHuaweiChannel。

AndroidNotificationChannel与AndroidNotificationHuaweiChannel字段说明如下:

名称

类型

描述

AndroidNotificationChannel

string

服务端推送时配置参数AndroidNotificationChannel赋值channel_idAndroid端创建通知时channel_id)。

AndroidNotificationHuaweiChannel

string

设置 Huawei 通知消息分类 importance 参数,决定用户设备消息通知行为,取值如下:

  • LOW:资讯营销类消息

  • NORMAL:服务与通讯类消息

关于AndroidNotificationChannel与AndroidNotificationHuaweiChannel的更多描述可以跳转Push - 高级推送查看。

服务端在推送消息时,需要根据步骤2中创建的通知通道的channel id进行参数设置,同时设置importance参数为NORMAL。示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidNotificationChannel("${channel_id}"); // 设置channel id
pushRequest.setAndroidNotificationHuaweiChannel("NORMAL"); // 设置importance参数
...
重要
  • 自定义通知通道方式仅支持数据处理位置为海外的应用,不支持数据处理位置为中国区的应用。

  • 铃声是通知通道的属性。通知通道一旦创建后推送消息的铃声为创建该通道时的铃声,后续将无法修改。

小米通道自定义铃声实现

自2023年2月1日起,小米发布了《推送消息分类新规》,将推送消息分为了私信消息以及公信消息两类。其中私信消息支持自定义铃声。

消息类型

划分原则

推送内容

管控规则

提醒方式

申请方式

私信消息

用户主动订阅、对收到此类消息有预期,或需要及时知道的消息等,如果错过可能会导致不良影响。

即时消息、个人账户、个人资产、个人订阅、个人日程、设备信息、订单及物流、工作信息。

每日推送数量无限制;

用户接收数量无限制。

响铃、振动

在推送运营平台申请,具体参见“channel申请及接入方法”。

公信消息

用户对收到此类消息无预期,关注程度较低。

新闻资讯、内容资讯、生活资讯、关注推荐、算法推荐、平台活动、互动信息、其他消息。

严格限制每日推送、接收数量,具体限制规则请参见“消息限制说明”。

私信消息支持自定义channel,自定义channel需要在小米推送运营平台申请,在申请时可以指定与该channel绑定的通知铃声。

操作步骤如下:

1. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

2. 在小米推送运营平台申请自定义channel

根据channel申请及接入方法申请私信消息类型的自定义channel,申请时在自定义铃声一栏填入铃声文件的URI。

20241224112329_mosaic

3. 服务端推送通知时配置小米推送运营平台生成的channel id

完成步骤2中的channel申请后,小米会给生成的channel分配一个channel id。

20241224112010_mosaic

服务端在推送消息时需要根据小米分配的channel id进行参数设置。

服务端推送通知时配置参数AndroidNotificationXiaomiChannel。

AndroidNotificationXiaomiChannel字段说明如下:

名称

类型

描述

AndroidNotificationXiaomiChannel

string

小米推送运营平台申请自定义channel时,生成的channel_id。需要在小米平台申请,详见:申请链接

说明

小米通道单个应用最多可申请 8 个 channel,请提前做好规划。

关于AndroidNotificationXiaomiChannel的更多描述可以跳转Push - 高级推送查看。

示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidNotificationXiaomiChannel("${channel_id}"); // 设置小米通道的channel id,需要与小米推送运营平台申请的channel id一致
...

OPPO通道自定义铃声实现

OPPO目前同时存在着旧消息分类方式:《消息分类说明》与新消息分类方式:《OPUSH消息分类细则》。目前新消息分类方式不支持自定义铃声,只有旧消息分类方式中的私信消息类型支持自定义铃声。

以2024年11月20日为界,11.20之后开启Opush的应用只能接入新消息分类方式,无法自定义铃声。11.20之前开启Opush的应用可以自由选择接入新消息分类方式或旧消息分类方式,其中接入旧消息分类方式的应用可以自定义铃声。

操作步骤如下:

1. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

2. 在OPPO推送运营平台上为应用申请自定义channel

登录OPPO推送运营平台,选择配置管理->通道配置->登记通道。

oppochannel

申请私信消息类型的自定义channel:

oppoprivate

3. 在客户端创建自定义通知通道

在创建通知通道时通过调用setSound()给通知通道指定铃声。此通知通道的id,需要与在oppo推送运营平台申请自定义channel时填写的通道ID保持一致。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // 通知通道的id,需要与在oppo推送运营平台申请自定义channel时填写的通道ID保持一致。
    String channelId = "${channel_id}"; // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
    // 用户可以看到的通知通道的名字。
    CharSequence name = "${通道描述}";
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
    // 配置通知通道的属性。
    //  自定义铃声
    mChannel.setSound(Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.alicloud_notification_sound), Notification.AUDIO_ATTRIBUTES_DEFAULT);
    // 最后在notificationmanager中创建该通知通道。
    mNotificationManager.createNotificationChannel(mChannel);
}
4. 服务端推送通知时配置参数

服务端推送通知时配置参数AndroidNotificationChannel。

AndroidNotificationChannel字段说明如下:

名称

类型

描述

AndroidNotificationChannel

string

服务端推送时配置AndroidNotificationChannel参数赋值channel_id(Android端创建通知时channel_id和oppo申请私信channel_id保持一致)

关于AndroidNotificationChannel的更多描述可以跳转Push - 高级推送查看。

服务端在推送消息时,需要根据步骤3中创建的通知通道的channel id进行参数设置。示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidNotificationChannel("${channel_id}"); // 设置channel id
...
重要
  • 只有2024年11月20日之前开启Opush的应用可以选择旧消息分类方式,支持自定义铃声。

  • 铃声是通知通道的属性。通知通道一旦创建后推送消息的铃声为创建该通道时的铃声,后续将无法修改。

FCM通道自定义铃声实现

安卓8.0以上版本可以在客户端创建自定义通知通道时指定铃声。

操作步骤如下:

1. 在客户端项目指定位置放入铃声文件

假设您的铃声文件为alicloud_notification_sound.mp3,您需要将它放到客户端项目工程的app/src/main/res/raw/目录下,即最终形如app/src/main/res/raw/alicloud_notification_sound.mp3。

2. 在客户端创建自定义通知通道

在创建通知通道时通过调用setSound()给通知通道指定铃声。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // 通知通道的id。
    String channelId = "${channel_id}"; // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
    // 用户可以看到的通知通道的名字。
    CharSequence name = "${通道描述}";
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = new NotificationChannel(channelId, 
                                          name, importance);
    // 配置通知通道的属性。
    //  自定义铃声
    mChannel.setSound(Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.alicloud_notification_sound), Notification.AUDIO_ATTRIBUTES_DEFAULT);
    // 最后在notificationmanager中创建该通知通道。
    mNotificationManager.createNotificationChannel(mChannel);
}
3.服务端推送通知时配置参数

服务端推送通知时配置参数AndroidNotificationChannel。

AndroidNotificationChannel字段说明如下:

名称

类型

描述

AndroidNotificationChannel

string

服务端推送时配置参数AndroidNotificationChannel赋值channel_idAndroid端创建通知时channel_id)。

关于AndroidNotificationChannel的更多描述可以跳转Push - 高级推送查看。

服务端在推送消息时,需要根据步骤2中创建的通知通道的channel id进行参数设置。示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setAndroidNotificationChannel("${channel_id}"); // 设置channel id
...
重要

铃声是通知通道的属性。通知通道一旦创建后推送消息的铃声为创建该通道时的铃声,后续将无法修改。

iOS自定义铃声

APNs通道自定义铃声实现

1. 客户端设置

将音频文件添加到Xcode项目的Bundle Resources中,并确保该文件包含在应用的构建目标中。

image

重要
  • 确保你的自定义声音文件符合iOS的要求:它必须是aiff, wav或caf格式。

  • 音频时长不应超过30秒,否则将使用默认系统铃声。详情参考Apple开发者文档

2. 服务端配置

请使用接口Push - 高级推送向iOS设备进行推送,关键参数如下:

名称

类型

描述

iOSMusic

string

iOS 通知声音。指定存放在 app bundle 或沙盒 Library/Sounds 目录下的音频文件名。

若指定为空串(””),通知为静音;若不设置,默认填充 default 为系统提示音。

示例代码如下:

PushRequest pushRequest = new PushRequest();
...
pushRequest.setIOSMusic("Basso.aiff"); // 设置iOS通知声音
...
重要

Apple的推送通知服务在模拟器上不支持测试远程通知功能,因此需要在真实设备上进行测试。