如何实现自定义铃声
通知和自定义消息均支持自定义铃声,实现方式如下:
消息类型 | 实现方法 | 注意事项 |
---|---|---|
通知 | 1. 客户端创建自定义渠道并设置自定义铃声。2. 服务端指定渠道 ID(channel_id)下发推送。 |
仅部分厂商通道支持自定义铃声,详情参考 支持通道说明。 |
自定义消息 |
客户端收到自定义消息回调后,自行处理响铃逻辑。 | 自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息,否则无法处理播报逻辑。 |
支持通道说明
消息类型 | 通道 |
备注 |
---|---|---|
通知 | ||
自定义消息 |
自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息。 |
从 Android 8.1(API 级别 27)开始,应用程序每秒不能多次发出通知声音。如果您的应用在一秒钟内发布多个通知,它们都会按预期显示,但每秒只有第一个通知发出声音。
极光/OPPO/FCM 通道通知实现
客户端设置
1.在项目工程 src/main/res/raw 下放入声音文件,这个文件对应服务端指定的 sound 字段(适配 8.0 以下系统)。
2.创建 channel 并设置 sound,详情参考 NotificationChannel 配置。
private void initChannel(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (nm != null){NotificationChannelGroup notificationChannelGroup = new NotificationChannelGroup("MyGroupId", "自定义通知组");
nm.createNotificationChannelGroup(notificationChannelGroup);
NotificationChannel notificationChannel = new NotificationChannel("m_channel123", "自定义通知 1", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setGroup("MyGroupId");
notificationChannel.enableLights(true);
notificationChannel.enableVibration(true);
notificationChannel.setSound(Uri.parse("android.resource:// 包名 /raw/ 铃声文件名称"), null);
nm.createNotificationChannel(notificationChannel);
}
}
}
服务端设置
推送时需要在 notification 下配置 sound 和 channel_id 字段,channel_id 需与客户端 创建的 channel 一致。
关键字 | 类型 | 选项 | 含义 | 说明 |
---|---|---|---|---|
sound | String | 可选 | 填写 Android 工程中 /res/raw/ 路径下铃声文件名称,无需文件名后缀 | 注意:针对 Android 8.0 以上,当传递了 channel_id 时,此属性不生效。 |
channel_id | String | 可选 | 通知栏消息分类 | 不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。 |
示例如下:
{
"notification": {
"android": {
"alert": "message alert",
"title": "title",
// 如果 sound 和 channel_id 都有传,那么会以 channel_id 的铃声为准
"sound": "coin",
"channel_id": "m_channel123"
}
}
}
小米通道通知实现
自 2023 年 2 月 1 日起,小米推送将消息分为“私信消息”和“公信消息”两个类别,消息类别通过 Channel 区分,且在 Android 8.0 及以上版本的通知效果也是以 Channel 中的效果为准,发送消息时设置自定义铃声将不会生效,需要在新建 Channel 时设置自定义铃声。
申请 Channel 方法
申请方式可参见小米官方文档 channel 申请及接入方法。
服务端处理
推送时在 notification 下指定 channel_id 字段进行下发。
推送时指定 options.third_party_channel.xiaomi.channel_id 字段进行下发。
关键字 | 类型 | 选项 | 含义 | 父项目 | 说明 |
---|---|---|---|---|---|
classification | int | 可选 | 消息类型分类 | options | 极光不对指定的消息类型进行判断或校准,会以开发者自行指定的消息类型适配 Android 厂商通道。不填默认为 0。 |
channel_id | string | 可选 | android 通知 channel_id | options.third_party_channel.xiaomi |
示例如下:
{
"options": {
"classification":1,
"third_party_channel": {
"xiaomi": {
"channel_id": "小米推送平台登记的 channel id"
}
}
}
}
华为通道通知实现
根据消息内容,华为推送将通知分类为服务与通讯、资讯营销两大类别,并对不同类别消息的提醒方式、消息样式进行差异化管理,具体如下:
消息类型 | 服务与通讯 | 资讯营销 |
---|---|---|
推送内容 | 包括社交通讯类消息和服务提醒类消息。 | 包括资讯类消息和营销类消息,指的是运营人员向用户发送的活动信息、内容推荐、资讯等。 |
提醒方式(EMUI 10.0 及以上) | 锁屏、铃声、振动 | 静默通知,仅在下拉通知栏展示消息 |
消息样式 | 文本 + 小图 | 仅有文本 |
配置方式 | 需要向华为申请自分类权益,审核通过后将信任开发者提供的分类信息,消息不经过智能分类。 | 默认 |
注意:2021 年 11 月开始,若您在华为官网申请的应用数据处理位置为中国区时,channel_id 字段无效,所以华为通道仅海外地区可以使用 channel_id 来实自定义铃声。
中国区设置
若您在华为官网申请的应用数据处理位置为中国区,可以通过服务端首次给应用推送 服务与通讯消息 时,携带 sound 和 default_sound 字段来实现自定义铃声,sound、 default_sound 和 importance 参数都在 option.third_party_channel.huawei 字段下。
注意:由于铃声是通知渠道的属性,因此铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。
服务端设置
关键字 | 类型 | 选项 | 含义 | 父项目 | 说明 |
---|---|---|---|---|---|
classification | int | 可选 | 消息类型分类 | options | 极光不对指定的消息类型进行判断或校准,会以开发者自行指定的消息类型适配 Android 厂商通道。不填默认为 0。 |
sound | string | 可选 | 华为自定义铃声 | options.third_party_channel.huawei | |
default_sound | boolean | 可选 | 华为默认铃声控制开关 | options.third_party_channel.huawei | 设置自定义铃声时与 sound 字段配合使用,且 default_sound 值设置为 false。注意:由于铃声是通知渠道的属性,因此自定义铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。 |
importance | string | 可选 | 华为通知栏消息智能分类 | options.third_party_channel.huawei |
{
"platform": "all",
"audience": {
"registration_id": ["1104a8979278ae64e75"]
},
"notification": {
"android": {
"alert": "message alert"
}
},
"options": {
"classification":1,//表示消息为服务与通讯类型
"third_party_channel": {
"huawei": {
"sound":"/raw/shake",
"default_sound":false,
"importance": "NORMAL"//表示消息为服务与通讯类型
}
}
}
}
海外地区设置
客户端设置
若您在华为官网申请的应用数据处理位置为非中国区时,可以使用自定义渠道去设置自定义铃声,客户端设置详情参考 创建自定义渠道。
华为自分类权益申请
创建渠道后,需要申请服务与通讯类型的通知,申请详情参见 华为消息分类管理方案。
- 若应用没有自分类权益,则应用的推送消息将通过智能分类进行自动归类。
- 若应用有自分类权益,将信任开发者提供的分类信息,消息不经过智能分类。
服务端设置
消息分类的申请审核通过后,即可在 options.third_party_channel.huawei 字段下指定 channel_id 和 importance 参数进行下发。
关键字 | 类型 | 选项 | 含义 | 说明 |
---|---|---|---|---|
channel_id | string | 可选 | 通知栏消息分类 | 不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。 |
importance | string | 可选 | 华为通知栏消息智能分类 |
{
"platform": "all",
"audience": {
"registration_id": ["1104a8979278ae64e75"]
},
"notification": {
"android": {
"alert": "message alert"
}
},
"options": {
"third_party_channel": {
"huawei": {
"channel_id": "自定义 channel id"
"importance": "NORMAL"//表示消息为服务与通讯类型
}
}
}
}
APNs 通道通知实现
格式要求
- 格式必须是 Linear PCM、MA4(IMA/ADPCM)、alaw,μLaw 的一种,且时长要求 30s 以下,否则就是系统默认的铃声,详见 官方开发者文档。
客户端设置
客户端需要将声音文件导入工程里,操作步骤:选中工程 Target -> Build Phrases -> Copy Bundle Resources
服务端设置
需要指定 iOS 平台下的 sound 参数,具体传入的值是声音文件名+后缀。
关键字 | 类型 | 选项 | 含义 | 说明 |
---|---|---|---|---|
sound | string 或 JSON Object | 可选 | 铃声 | 通知提示声音或警告通知。具体说明如下: |
{
"platform": "all",
"audience": {
"registration_id": [
"1104a8979278ae64e75"
]
},
"notification": {
"ios": {
"alert": "hello, JPush!",
"sound": "sound.caf",
}
},
"options": {
"apns_production": false
}
}
自定义消息实现
若需要动态播报自定义铃声,可下发自定义消息,客户端在自定义消息回调中自行处理播放逻辑。
Android 平台:
import cn.jpush.android.service.JPushMessageService;
public class PushMessageService extends JPushMessageService {
private static final String TAG = "PushMessageService";
@Override
public void onMessage(Context context, CustomMessage customMessage) {Log.e(TAG,"[onMessage]"+customMessage);
// 在此回调中处理播报
}
iOS 平台:
获取 iOS 的推送内容需要在 delegate 类中注册通知并实现回调方法。
在方法- (BOOL)application:(UIApplication _)application didFinishLaunchingWithOptions:(NSDictionary _) launchOptions 加入下面的代码:
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
实现回调方法 networkDidReceiveMessage
- (void)networkDidReceiveMessage:(NSNotification *)notification {
NSDictionary * userInfo = [notification userInfo];
NSString *content = [userInfo valueForKey:@"content"];
NSString *messageID = [userInfo valueForKey:@"_j_msgid"];
NSDictionary *extras = [userInfo valueForKey:@"extras"];
NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的 Extras 附加字段,key 是自己定义的
}