uniPush官网地址https://uniapp.dcloud.io/unipush.html
Uni-Push是集成的个推,所以服务端接口使用的是个推的API。
在manifest.json中的App模块配置中勾选Push及下面的uniPush。
使用的客户端API参考HTML5+APP
一、开通推送服务
需要App的创建者在后台服务端开通推送服务,并配置相关的参数,如:包名,签名,第三方通道等信息。
二、客户端获取clientId即cid
//#ifdef APP-PLUSplus.push.getClientInfoAsync(res => {console.log('获取推送客户端信息成功:clientId = ' + res['clientId']);},err => {console.error('获取推送客户端信息失败:', err);});//#endif
三、添加信息监听
addPushEventListener(that) {//#ifdef APP-PLUS//监听系统通知栏消息点击事件,用户点击系统通知栏中的消息,APP启动或者激活到前台运行,触发click事件。// 注意:Android平台推送服务器下发的透传消息符合以下json格式:{title:"标题",content:"内容",payload:"自定义数据"}// 时,会作为普通推送通知处理,在系统通知栏创建消息,点击消息激活APP触发"click"事件。plus.push.addEventListener('click',msg => {console.log('监听系统通知栏消息点击事件->click:', msg);//使用页面间通信, 在需要接收的地方处理,可以根据msg内容发送不同的信息uni.$emit('unipush-message',msg);//其他业务逻辑处理,如:模拟更新角标数字this.mockReceivePushInfo(that);},false);//监听接收透传消息事件,客户端接收到透传消息时(在系统通知栏中不显示消息),触发receive事件。plus.push.addEventListener('receive',msg => {console.log('监听接收透传消息事件->receive:', msg.payload);//使用页面间通信, 在需要接收的地方处理,可以根据msg内容发送不同的信息uni.$emit('unipush-message',msg);//其他业务逻辑处理,如:模拟更新角标数字this.mockReceivePushInfo(that);},false);//#endif},
四、绑定别名、标签等
由于uniPush的客户端中没有直接绑定别名、标签等的API,所以需要调用个推的服务端接口进行实现。注意单推和批量推送的接口区别,详情参考个推文档
1、获取token
const http = require('./http.js');const signUtil = require('./signUtil.js');const appInfo = {appId:'xxx',appkey: 'xxx',AppSecret:'xxx',MasterSecret:'xxx'}const baseUrl = `https://restapi.getui.com/v2/${appInfo.appId}`;var authToken ='';/*** 获取token*/function getToken(){console.log('获取 token 开始。。。');let tokenUrl = `${baseUrl}/auth`;let timestamp = signUtil.createTimeStamp();let sign = signUtil.getGetuiSign(appInfo.appkey,timestamp,appInfo.MasterSecret);let data = {appkey: appInfo.appkey,timestamp: timestamp,sign: sign};console.log('获取 token 的url:',tokenUrl);http.postJsonData(tokenUrl,data).then(res =>{console.log('获取token结果:',res);if(res.result === 0){authToken = res.authToken;}}).catch(e =>{console.error('获取token失败:',e);}).finally(()=>{console.log('获取token结束。。。');})}
2、根据CID推送
/*** 向单个用户推送消息,可根据cid指定用户* @param {*} token*/function sendNotificationToCid(token){console.log('sendNotificationToCid 开始。。。');let url = `${baseUrl}/push/single/cid`;let data = {"request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),"settings":{"ttl":3600000},"audience":{"cid":["344a2566584425ca0546a76f41fa81de"]},"push_message":{"notification":{"title":"会议邀请","body":"应急管理局刘宝兴邀请您参加会议","click_type":"intent","intent":"intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.gsafety.mobile.ptt/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=会议邀请;S.content=应急管理局邀请您参加会议;S.payload={lbx};end","badge_add_num":"1"}},"push_channel":{"android":{"ups":{"notification":{"title":"会议邀请-android","body":"应急管理局刘宝兴邀请您参加会议-android","click_type":"intent","intent":"intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.gsafety.mobile.ptt/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=会议邀请;S.content=应急管理局邀请您参加会议;S.payload={lbx};end","badge_add_num":"1"}}},"ios":{"type":"notify","payload":"自定义消息","aps":{"alert":{"title":"会议邀请-ios","body":"应急管理局刘宝兴邀请您参加会议-ios"},"content-available":0},"auto_badge":"+1"}}}console.log('sendNotificationToCid 的url:',url);http.postJsonData(url,data,{token:token}).then(res =>{console.log('sendNotificationToCid结果:',res);}).catch(e =>{console.error('sendNotificationToCid失败:',e);});}
/*** 通过cid推送透传消息* @param {*} token*/function sendTransmissionToCid(token){console.log('sendTransmissionToCid 开始。。。');let url = `${baseUrl}/push/single/cid`;// 传递给app处理的参数let msg = {"targetType":"local","businessType":"hidden-danger-identification-deploy","targetPath":"/subpkg/pages/warning-notification/warning-notification?id=123&name=lbx","ext":"ext",}let msg1 = {"targetType":"web","businessType":"","targetPath":"https://www.baidu.com","ext":"百度",}//弹出系统通知的title和body内容let notification = {"title":"会议邀请","body":"应急管理局刘宝兴邀请您参加会议1",}//目标cidlet targetCid = '1f2dc41154fd90f55e38bed5b99ac443'let data = {"request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),"settings":{"ttl":3600000},"audience":{"cid":[targetCid]},"push_message":{"transmission":JSON.stringify(msg),},"push_channel":{"android":{"ups":{"notification":{...notification,"click_type":"intent","intent":`intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.gsafety.mobile.ptt/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=会议邀请;S.content=应急管理局邀请您参加会议;S.payload=${JSON.stringify(msg)};end`,"badge_add_num":"1"}}},"ios":{"type":"notify","payload":JSON.stringify(msg),"aps":{"alert":{...notification},"content-available":0},"auto_badge":"+1"}}}console.log('sendTransmissionToCid 的url:',url);http.postJsonData(url,data,{token:token}).then(res =>{console.log('sendTransmissionToCid结果:',res);}).catch(e =>{console.error('sendTransmissionToCid失败:',e);});}
3、绑定别名
/*** 绑定别名*/function bindUserAlias(token){console.log('bindUserAlias 开始。。。');let url = `${baseUrl}/user/alias`;let data = {data_list:[{cid:'344a2566584425ca0546a76f41fa81de',alias:'1234567890_xiaomi'},{cid:'40dba2f9f5f0d4d19ef9e6667f2c00e4',alias:'1234567890_apple'},]}http.postJsonData(url,data,{token:token}).then(res =>{console.log('bindUserAlias 结果:',res);}).catch(e =>{console.error('bindUserAlias 失败:',e);})}
4、根据别名推送
/*** 通过别名推送透传消息* @param {*} token*/function sendTransmissionToAlias(token){console.log('sendTransmissionToAlias 开始。。。');let url = `${baseUrl}/push/single/alias`;let data = {"request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),"settings":{"ttl":3600000},"audience":{"alias":["1234567890_xiaomi"]},"push_message":{"transmission":JSON.stringify({id:'123',name:'lbx'}),},"push_channel":{"android":{"ups":{"notification":{"title":"会议邀请-android-alias","body":"应急管理局刘宝兴邀请您参加会议-android-alias","click_type":"intent","intent":"intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.gsafety.mobile.ptt/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=会议邀请;S.content=应急管理局邀请您参加会议;S.payload={lbx};end","badge_add_num":"1"}}},"ios":{"type":"notify","payload":"自定义消息","aps":{"alert":{"title":"会议邀请-ios","body":"应急管理局刘宝兴邀请您参加会议-ios"},"content-available":0},"auto_badge":"+1"}}}console.log('sendTransmissionToAlias 的url:',url);http.postJsonData(url,data,{token:token}).then(res =>{console.log('sendTransmissionToAlias结果:',res);}).catch(e =>{console.error('sendTransmissionToAlias失败:',e);});}
5、其他功能请参考个推文档
五、其它问题
1、vivo厂商通道推送
需要App在vivo商店上线后才可以推送,测试阶段只能使用vivo的服务端api进行测试。且需要在vivo后台配置测试机的regId才可以。regId的获取TTMD难搞了。vivo手机的日志不输出,输出了,又TMD的带星号,最后只能将regId显示到一个TextView上,然后手动将其配置到vivo的后台。【其实可以在测试机的界面上复制粘贴的,但是嫌麻烦,还得弄个通信软件什么的,就直接一个一个字符输入的】VivoTTMD变态了。
另外测试时,一定要注意 pushMode参数,将其设置为1,测试模式啊,因为我们的应用没有在vivo商店上架,属于受限应用。参考vivo服务端接口
:::info
推送模式 0:正式推送;1:测试推送,不填默认为0(测试推送,只能给web界面录入的测试用户推送;审核中应用,只能用测试推送)
:::
const http = require('./http.js');const signUtil = require('./signUtil.js');const appInfo = {appId:'xxx',appkey: 'xxx',AppSecret:'xxxx'};//测试机的regIdconst testRegId = '16528632681006142081625';const baseUrl = 'https://api-push.vivo.com.cn';let tokenUrl = `${baseUrl}/message/auth`;console.log('tokenUrl = '+tokenUrl);let timestamp = signUtil.createTimeStamp();let sign = signUtil.getVivoSign(appInfo.appId,appInfo.appkey,timestamp,appInfo.AppSecret);let data = {appId:appInfo.appId,appKey: appInfo.appkey,timestamp: timestamp,sign: sign};var authToken = '08250f68-0fdc-47b4-8a5b-ddaa7d48c4ba';function getToken(){console.log('获取 token 开始。。。');http.postJsonData(tokenUrl,data).then(res =>{console.log('获取token结果:',res);if(res.result === 0){authToken = res.authToken;}}).catch(e =>{console.error('获取token失败:',e);}).finally(()=>{console.log('获取token结束。。。');})}function sendMessageToSingleUser(token){let url = `${baseUrl}/message/send`;let data = {"regId":testRegId,"notifyType":4,"title":"会议邀请","content":"应急管理局刘宝兴邀请您参加会议","timeToLive":86400,"skipType":4,"skipContent":"intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.gsafety.mobile.ptt/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=会议邀请;S.content=应急管理局邀请您参加会议;S.payload={lbx};end","networkType":"1","clientCustomMap":{"id":"123","name":"lbx"},"extra":{"callback":"http://www.vivo.com","callback.param":"vivo"},"requestId":"25509283-3767-4b9e-83fe-b6e55ac6b123-"+timestamp,"pushMode":1};http.postJsonData(url,data,{authToken:token}).then(res =>{console.log('sendMessageToSingleUser结果:',res);}).catch(e =>{console.error('sendMessageToSingleUser失败:',e);});}if(authToken === ''){getToken();}else{sendMessageToSingleUser(authToken);}
