注意:
- 从HBuilderX 1.7.2起,uni-app支持UniPush。
- 从HBuilderX 2.0.3 alpha起,5+App支持UniPush。
- UniPush是DCloud推出的集成型统一推送服务,内建了苹果、华为、小米、OPPO、魅族等手机厂商的系统级推送和个推等第三方推送。(vivo只对某些开发者开放)
架构
推送消息类型
通常推送消息分以下两种类型:
通知栏消息(推送通知)
UniPush推送服务定义好的推送样式、后续动作的推送方式,客户端接收到后显示在系统通知栏,用户点击通知栏消息启动APP(激活到前台)。透传消息(推荐使用该方式)
即自定义消息,UniPush推送服务只负责消息传递,不做任何处理,客户端在接收到透传消息后需要自己去处理消息的展示方式或后续动作
UniPush推送服务对透传消息的数据符合以下格式时做了特殊处理,即符合该格式的透传消息会自动显示到系统通知栏【需要确保app通知权限已打开】
{"title": "xxx","content": "xxx","payload": "xxx"}
起步
在开发者中心为应用开通UniPush
开通之后在开发者后台可以直接推送消息,方便测试。【不能调试安装,需云打包/自定义基座】
注:【由于没有配置厂商通道所以此时我们的app只能在线接收消息。但ios不用,既然提到就多说一点,配置ios推送服务必然要配置ios推送证书,其实在制作iOS推送证书的时候可以直接制作一份发布环境的Push证书,因为该证书发布和开发环境都能用,何必做两份呢。~抖机灵
苹果推送不同于安卓,他自有一套推送,配置好证书,在线离线都能接收】
没有配置厂商的只有最上面两个输入框,按要求填入对应的信息然后推送,手机能收到推送就说明基础的配置完成了。
以上步骤可以向让安装了该软件的设备(安卓在线) 群发 通知,他们或早或晚收到推送。
【没有说全部!推送服务并不可靠,它会因为网络、推送服务器、以及用户设备、等各种原因导致譬如 “为什么我收不到推送” 这种问题。测试人员问过我几万遍了,头都痛。它适用于推送一些活动广告,一些重要内容,要求必达的信息不说顺丰,东风也不一定送的准。总之宗旨就是:收到了最好,收不到算了】
群发可能并不满足项目的需求,可能我们需要像并夕夕一样,针对我买的 劳斯莱斯-幻影 单独给我推送:尊敬的并夕夕高端用户;您全款购买的 劳斯莱斯-幻影 已发货,正在等待揽收。
它如何单独推送到我的手机上,避免全世界都知道我的Rolls-Royce发货提前去蹲点拆包的呢?
我们要与后端一起维护一个表,比如叫UserCID。这个表包含我的基本账户信息,以及CID。这个CID是客户机ID的意思,是设备唯一标识。我们要做的是一打开app就去获取CID,由于它不是天生就有,所以我们做一个定时器等到它为之。然后用户登录的时候,将这个唯一标识伴随我们的账户信息一起传给服务器。服务器验证登录成功的同时将它保存到UserCID.
// #ifdef APP-PLUS
getCID() {
var timer = setInterval(() => {
var info = plus.push.getClientInfo();
this.cid = info.clientid;
if (this.cid) {
clearInterval(timer);
console.log('获取CID',this.cid)
}
}, 1000);
},
//#endif
当需要给特定用用户推送的时候,后台通过UserCID查询它的CID,然后推送的时候给推送服务器传入该CID.(这是后端接入的时候所要做的)
然后到推送后台推送消息,使用创建的cid.txt
里面写了几个CID就将推送给几个设备,错的CID、失效的CID他也会算上,以实际到位为准就好。
如果你测试的收到了,那你就算做对了。
以上在线推送我们已经做到了(安卓),为了离线也能收到推送,我们需要配置安卓厂商通道。
【推送是推送服务器向指定设备的指定app发送通知消息,当app在线,它知道是自己的邮件自己会接收<符合特定格式将展示在通知栏>。由于移动设备的各种省电策略、以及安全机制,会出现杀后台的情况,这样在后台的应用说不定某个时间就离线了,这时候邮件会保存在手机本地(类似学校门卫),app什么时候醒了自己就去门卫领邮件去了。这时候可能就不够及时。为了离线也能将信息发送到用户手机上,我们就需要借助手机系统,让他帮我们通知。(安卓出自谷歌,谷歌服务有推送,国内被墙,各厂商开始在自己系统上集成推送服务。厂商通道)】
厂商通道申请以及配置流程
如果要更完善一些,我们就要脑补一些情景,比如我偶然一次忘了带我的8848手机,于是我借对面屌丝程序员的手机登录并夕夕看看我的劳斯莱斯送到哪了。这时候它手机上的唯一标识就也保存到了UserCID,并且关联的是我的账号。于是将来给我推送的时候,会给两部手机推送,即便当时借他手机看完物流就退出账号了。所以我们要在退出账号的时候,把账号和CID再给后台,让后台在UserCID中把该账号名下的这个CID删除。
课外补充:
不论安卓、IOS在app图标上都会显示未读消息角标。提示的是未读消息数量。见过的手机不多,本人自用小米、apple,初步判断在安卓系统上角标是由系统自己管理的,当用户清理通知栏消息,或者将app激活到前台,角标会消失。下次有新的推送时会将角标激活。
但是ios角标是需要我们通过代码管理的,后台可以知道未读消息数量,前端通过接口获取未读消息数然后写到IOS角标上。
setBadeg(newNum) {
//设置应用图标的数量
plus.runtime.setBadgeNumber(newNum);
}
推送会增加未读消息数,由此我们利用推送可以附带参数的功能,让后端在推送的时候直接将未读消息数量告诉我们。这样可以减少一点app的请求。【注:推送附带参数放在payload中】
//监听接收透传消息事件
plus.push.addEventListener('receive', (msg) => {
console.log('监听接收透传消息事件', msg);
uni.getSystemInfo({
success: (res) => {
console.log(res.platform);
if (res.platform == "ios") {
// console.log(msg.payload);
let num = parseInt(msg.payload.num);
this.setBadeg(num);
}
}
})
}, false);
当用户查看了消息,我们需要将角标消息减一。【注:这是本地减一,并未从服务器获取】
subBadeg() {
//导入ios UIApplication
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
//获取应用图标的数量
var oldNum = app.applicationIconBadgeNumber();
var newNum = oldNum - 1;
//设置应用图标的数量
plus.runtime.setBadgeNumber(newNum);
},
当用户点击通知栏消息进入app,我们也需要角标减一。
//监听系统通知栏消息点击事件
plus.push.addEventListener('click', (msg)=> {
console.log('监听到消息点击事件', msg);
uni.getSystemInfo({
success: (res) => {
// console.log(res.platform);
if (res.platform == "ios") {
this.subBadeg();
}
}
});
}, false);