🖼 在理想的最美好世界中,一切都是为最美好的目的而设。 —— 伏尔泰
一、相关文档
-
极光推送restApi:https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push
-
极光推送sdk:https://github.com/jpush/jpush-api-java-client
二、相关概念
2.1 厂商通道
极光推送正常情况是使用自带的极光通道,但是如果想在app离线后依然能够收到推送就需要接入厂商通道。
安卓集成,比较特殊的有小米,OPPO,vivo,集成这几个通道需要上架他们对应的应用市场才能使用,其他的通道按官方文档集成一下就行
IOS集成,这个简单的多了,把对应的参数填一下就行。
ios支持开发与生产环境配置,需要分别配置,接口使用时需要指定options-》apns_production参数值为true或false(true生产,false开发)
![]() | ![]() |
2.2 离线消息
离线消息问题就比较多了,别名绑定的设备不活跃(在线时间太短)收不到离线消息,别名不存在也收不到离线消息。
所以针对别名不存在发送失败的情况,我的解决方案是:
针对推送失败的消息,当用户在app登录时,重新发送一次,也算是离线消息了
三、接口关键内容
3.1 audience:推送目标
https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push#audience%EF%BC%9A%E6%8E%A8%E9%80%81%E7%9B%AE%E6%A0%87
3.1.1 接口调用主要支持以下类型
all | String | 发广播 | 给全部设备进行推送 | 基于业务优化的需求,极光于 2020 年 3 月 10 日对「广播推送」的频率进行限制,调整为 10 次每天,超过调用限制时将返回报错码 2008,官网控制台将与 Push API 同步调整。注意:本次调整仅限制广播,对广播外的推送不影响。如广播推送需更高频率,请 联系商务 ,详情请阅读 公告 。 |
tag | JSON Array | 标签 OR | 数组。多个标签之间是 OR 的关系,即取并集。 | 用标签来进行大规模的设备属性、用户属性分群,此功能为 VIP 用户功能。一次推送最多 20 个。有效的 tag 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符 @!#$&*+=.|¥。限制:每一个 tag 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码) |
alias | JSON Array | 别名 | 数组。多个别名之间是 OR 关系,即取并集。 | 用别名来标识一个用户,一个设备只能绑定一个别名,但多个设备可以绑定同一个别名。一次推送最多 1000 个。有效的 alias 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符 @!#$&*+=.|¥。限制:每一个 alias 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码) |
registration_id | JSON Array | 注册 ID | 数组。多个注册 ID 之间是 OR 关系,即取并集。 | 设备标识,客户端集成 SDK 后可获取到该值。一次推送最多 1000 个。如果您一次推送的 registration_id 值超过 1000 个,可以直接使用 文件推送 功能。 |
segment | JSON Array | 用户分群 ID | 在页面创建的用户分群的 ID。定义为数组,但目前限制一次只能推送一个。 | 目前限制是一次只能推送一个。 |
3.1.2 别名使用
目前项目使用的是别名,格式为“用户名_用户类型”,这个也是用的最多的一种方式,一个别名只能对应一个设备,但是实际上去使用时,发现是可以对应2个的,一个别名在第三个设备注册时,第一个就收不到推送了,所以实际使用时需要避免一个别名被多个设备使用
测试在测试app推送时就会经常出现收不到推送的问题,原因也都是因为这个别名在多个设备上登录过。
3.2 notification:通知
https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push#notification%EF%BC%9A%E9%80%9A%E7%9F%A5
3.2.1 android推送内容格式
主要列举几个典型的
{
"notification" : {
"android" : {
"alert" : "hello, JPush!", //推送内容 只有这个必填
"title" : "JPush test", //推送标题
"extras" : {
//这里传的是自定义的业务参数,key和value都自定义 ,
//比如本次的签署链接 传了个signUrl,在点击推送时打开app时会把这里面的内容带到app,
//app收到后使用
"signUrl" : "https://www.baidu.com"
}
}
}
}
3.2.2 ios推送内容样式
其实还有很多有用的属性,比如设置收到时的提示声音,或者收到推送后的应用角标数等,集体可以看文档
{
"notification" : {
"ios" : {
"alert" : "hello, JPush!",//通知内容,ios不一样的是他没标题
"extras" : {
//这里传的是自定义的业务参数,key和value都自定义 ,
//比如本次的签署链接 传了个signUrl,在点击推送时打开app时会把这里面的内容带到app,
//app收到后使用
"signUrl" : "https://www.baidu.com"
}
}
}
}
3.3 restApi方式推送
请求地址:https://api.jpush.cn/v3/push
请求类型:http请求
参数示例
{
"notification": {
"alert": "【合同】2023食品商务合同xdj-杭州永强食品有限公司-HT20230224014218已发起合同签署流程,请签署",
"android": {//内容
"alert": "【合同】2023食品商务合同xdj-杭州永强食品有限公司-HT20230224014218已发起合同签署流程,请签署",
"extras": {
"signUrl": "https://scm.test.laiyifen.com/server/contract/login/common/toLogin?username=15115673779&usertype=9&signId=2679"
},
"title": "【您有一份合同待签署】"
},
"ios": {
"alert": {//内容
"body": "【合同】2023食品商务合同xdj-杭州永强食品有限公司-HT20230224014218已发起合同签署流程,请签署",
"title": "【您有一份合同待签署】"
},
"sound": "default", //铃声
"extras": {
"signUrl": "https://scm.test.laiyifen.com/server/contract/login/common/toLogin?username=15115673779&usertype=9&signId=2679"
},
"content-available": true //true生产,false开发
}
},
"audience": {
"alias": [
"15115673779_FOOD_SUPPLIER"
]
},
"options": {
"apns_production": true,
"time_to_live": 259200
},
"platform": "all"
}
返回参数示例:
成功
{
"sendno": "0",
"msg_id": "18100623961567207"
}
失败
{
"msg_id": "18100624120224845",
"error": {
"code": 1011,
"message": "cannot find user by this audience or has been inactive for more than 255 days"
}
}
3.4 SDK调用
本次使用的restApi,具体SDK怎么使用还是自己研究吧
github地址:https://github.com/jpush/jpush-api-java-client
四、常见问题
4.1 安卓联调收不到推送
安卓联调时可能会出现收不到推送的情况,由于安卓环境没有统一的推送通道,想要提高消息接受率最好是接入对应机型的厂商通道,如华为手机接入华为厂商通道