uniapp 集成推送功能
1,在开发后台点击需要开通的应用–点击uniPush–配置对应的信息,默认情况下,Android的包名跟APPID的相同


2,云打包时勾选APP模块配置–push(消息推送)–uniPush

3,用户安装之后,即可使用开发者的后台–UniPush–创建推送–发送通知消息(需要有人安装打包好之后的APP才可以推送,如果没人安装过,将无法点击发送)
注: 直接运行项目到真机是不可行的,可通过IDE中的自定义基座,然后再运行到手机中进行测试, !!!自定义基座这种方式在使用厂家推送时不可用
至此,安装APP的用户将收到一个消息通知,最简单的推送集成就完成了
注意:(应用右上角角标的显示,目前使用官方的推送是不太好实现所有机型的兼容的,目前的具体情况如下:
不同ROM接收推送消息对桌面图标的角标处理逻辑存在差别
- 小米手机:角标自动加1 (MIUI11 以下) 另:高版本MIUI 设置角标会以通知的形态发送
- 华为手机:可以设置,走厂家通道离线推送可在服务端设置。参考可插件链接:https://ext.dcloud.net.cn/plugin?id=1680
- vivo手机:不会自动加1,需调用5+ API plus.runtime.setBadgeNumber动态设置角标数字
- oppo手机:角标自动展示,具体形态与rom相关,可能是红点或数字。(需要打开角标权限)
iOS平台
根据接收到的推送消息处理桌面图标的角标,在uniPush后台的“iOS配置”项中可配置badge参数对角标进行设置,可取值:
- “+1”,表示当前角标+1;
- “-1”,表示当前角标-1(角标>=0);
- “3”,表示指定角标值,值必须>=0。
默认(不设置badge参数)则角标数字不变,也可以在应用运行期调用5+ API plus.runtime.setBadgeNumber动态设置角标数字
)
下面是真正项目中的使用,开通的流程跟上述一样,不多加赘述
1,消息精准推送到某个用户,利用H5+获取用户安装时的CID,根据CID来进行精准推送
1,在APP启动的之后的代码中,加入plus.push.getClientInfo().clientid,获取用户的CID,可发给后台进行绑定,(注意每次重新安装APP,CID都不相同,如果是同一用户,需要进行更新CID的操作)
onLoad(){
uni.showModal({
title:plus.push.getClientInfo().clientid
})
},

2.客户端监听推送的事件,利用H5+的API来完成,回调函数中的参数为推送信息的内容,根据内容进行业务逻辑处理
plus.push.addEventListener('click', (mes)=>{
console.log("mes")
console.log(mes)
/*
msg.title -- 推送的标题,会在通知栏中显示
msg.content -- 推送的内容,会在通知栏中显示
msg.subtitle -- 二级标题,会在通知栏中显示
msg.palyload -- 自定义的payload内容,该内容不会展示在通知栏的通知中,可以在此处携带ID之类不想用户看到的信息
*/
uni.showModal({
title:'点击了推送信息'
})
});
plus.push.addEventListener('receive', (mes)=>{
console.log("mes")
console.log(mes)
/*
msg.title -- 推送的标题,会在通知栏中显示
msg.content -- 推送的内容,会在通知栏中显示
msg.subtitle -- 二级标题,会在通知栏中显示
msg.palyload -- 自定义的payload内容,该内容不会展示在通知栏的通知中,可以在此处携带ID之类不想用户看到的信息
*/
uni.showModal({
title:'接受到了推送信息'
})
});
透传消息(注解:透传消息未配置厂商推送之前,只能在APP前台运行时才能被监听到,一旦后台运行或者离线之后,都不会收到推送信息,在配置了厂商的推送之后的话,则可以通过厂商的推送在APP后台或者离线时进行推送消息)
总结:
| 选项 | 优点 | 缺点 |
|---|---|---|
| unipush中的通知消息,适用于不需要杀死进程后仍接收通知的应用 | 集成简单,不需要申请每个厂商的推送通道 | 1,进程杀死后,推送则不可送达 2,应用在前台运行时,推送也会出现消息通知,不可控 |
| unipush中的透传消息,不配置厂商推送 | 消息推送不会出现在通知栏,可由开发者监听到消息之后进行自定义的业务逻辑 | 程序一旦后台或者被杀死进程,都无法监听到消息推送 |
| unipush中的透传消息,配置厂商推送 | 1.应用在前台运行时,可监听到消息推送,不会直接出现在手机通知栏中 2,应用后台运行后,或者进程杀死后,消息会出现在通知栏中,点击后唤起APP | 安卓每个厂商都需要申请厂商的推送,然后进行配置,比较麻烦 |
手机推送测试(官方推送在未配置厂商推送信息的情况下,杀死进程后,推送消息无法在通知栏中出现,需要等到APP再次在线,才会重新弹出推送消息)
| 机型 | 推送方式 | 应用未读角标 | receive | click |
|---|---|---|---|---|
| 红米K20PRO | unipush的消息通知 | 无,不可设置,(H5+的setBadgeNumber方法在小米11以上的系统中,会以通知栏的方式出现) | 没有触发 | 有触发 |
| 红米K20PRO | unipush的消息通知,在后续操作中配置附加消息 | 无 | 在用户手动点击通知之后才会触发 | 在点击通知之后才会触发 |
| 红米K20PRO | unipush的透传消息 | 无 | 应用前台运行时,可触发 | 不会触发通知栏消息 |
| 华为P20pro | unipush的消息通知 | 可设置 | 未监听到 | 通知栏点击可监听到该事件 |
安卓配置厂家推送之后,在透传消息时,需要填入对应intent,由于uniapp只能进入首页,所以代码几乎是固定的,替换一下包名即可,厂商推送需要设置的Intent字符串格式,请将p a c k a g e N a m e , {packageName},packageName,{title},c o n t e n t , {content},content,{payload}替换为正确的内容
${packageName} 代表应用包名
${title} 通知的标题
${content} 通知的内容
${payload} 其他附加参数,请用 JSON.toJSONString(payload)进行转码。可不填
intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;package=${packageName};component=${packageName}/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=${title};S.content=${content};S.payload=${payload};end

手机推送测试(已配置厂商推送渠道),要走厂商通道,要选择透传消息
注:厂家推送需要不可用使用自定义基座或者真机运行,需要打包之后测试,
| 机型 | 应用未读角标 | receive | click |
|---|---|---|---|
| 红米K20pro | 需要用户手动设置系统权限才会展示 | 在线时,会正常触发,离线时则不会 | 厂商通道的消息点击之后会触发 |
| 华为P20PRO | unipush的web后台推送不会出现角标,需要使用后台调用api方可出现角标 | 在线时,会正常触发,离线时则不会 | 厂商通道的消息点击之后会触发 |
| 苹果8,IOS13.7 | 前台运行时没有,后台运行会有,需要手动调用plus.runtime.setBadgeNumber(0),进行红点清除 | 应用后台运行时,不会触发 | 杀死进程后任然可以推送消息通知,点击事件也正常 |
至此接入结束,在使用过程中有问题可以找个推的技术咨询,回复都比较快,多看官方的文档其实大部分的问题都已经能找到的了
UniPush开通指南 https://ask.dcloud.net.cn/article/35716
UniPush使用指南 http://ask.dcloud.net.cn/article/35622
Unipush常见问题 https://ask.dcloud.net.cn/article/36611
服务端api接口推送调用文档
https://docs.getui.com/getui/server/rest_v2/push/
实际项目使用中,IOS的前台运行,接收到透传消息之后,再创建本地通知时,会进入死循环的问题解决
// APP.VUE 的onLoad生命函数中添加下述代码
let timer = false;
plus.push.addEventListener("click",(msg)=>{
// 当消息被点击进入的回调
clearTimeout(timer);
timer = setTimeout(()=>{
if(plus.os.name == 'iOS'&& typeof msg.payload == 'string'){
// IOS跟安卓得到数据不一样,安卓是对象,IOS是JSON
msg.payload = JSON.parse(msg.payload)
}
if(msg.payload){
uni.navigateTo({
url:`${msg.payload.url}`
})
}
},500)
},false)
plus.push.addEventListener("receive",(msg)=>{
// 接收到消息时进入的回调
let payloadObj = JSON.parse(msg.payload)
if(payloadObj.msgType == 'LocalMSG' && plus.os.name == 'iOS'){
// 防止IOS下创建本地通知时会出现死循环的情况
return
}
var options = {cover:false,title:msg.title};
payloadObj.msgType = 'LocalMSG' // 添加多一个值来让ios可以判断是不是本地创建的消息
let payLoadStr = JSON.stringify(payloadObj)
plus.push.createMessage(msg.content, payLoadStr, options );
},false)