uniPush官网地址https://uniapp.dcloud.io/unipush.html
Uni-Push是集成的个推,所以服务端接口使用的是个推的API。
在manifest.json中的App模块配置中勾选Push及下面的uniPush。
使用的客户端API参考HTML5+APP
一、开通推送服务
需要App的创建者在后台服务端开通推送服务,并配置相关的参数,如:包名,签名,第三方通道等信息。
二、客户端获取clientId即cid
//#ifdef APP-PLUS
plus.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",
}
//目标cid
let 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'
};
//测试机的regId
const 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);
}