uniPush官网地址https://uniapp.dcloud.io/unipush.html
Uni-Push是集成的个推,所以服务端接口使用的是个推的API。
在manifest.json中的App模块配置中勾选Push及下面的uniPush。
使用的客户端API参考HTML5+APP

一、开通推送服务

需要App的创建者在后台服务端开通推送服务,并配置相关的参数,如:包名,签名,第三方通道等信息。

二、客户端获取clientId即cid

  1. //#ifdef APP-PLUS
  2. plus.push.getClientInfoAsync(
  3. res => {
  4. console.log('获取推送客户端信息成功:clientId = ' + res['clientId']);
  5. },
  6. err => {
  7. console.error('获取推送客户端信息失败:', err);
  8. }
  9. );
  10. //#endif

三、添加信息监听

  1. addPushEventListener(that) {
  2. //#ifdef APP-PLUS
  3. //监听系统通知栏消息点击事件,用户点击系统通知栏中的消息,APP启动或者激活到前台运行,触发click事件。
  4. // 注意:Android平台推送服务器下发的透传消息符合以下json格式:{title:"标题",content:"内容",payload:"自定义数据"}
  5. // 时,会作为普通推送通知处理,在系统通知栏创建消息,点击消息激活APP触发"click"事件。
  6. plus.push.addEventListener(
  7. 'click',
  8. msg => {
  9. console.log('监听系统通知栏消息点击事件->click:', msg);
  10. //使用页面间通信, 在需要接收的地方处理,可以根据msg内容发送不同的信息
  11. uni.$emit('unipush-message',msg);
  12. //其他业务逻辑处理,如:模拟更新角标数字
  13. this.mockReceivePushInfo(that);
  14. },
  15. false
  16. );
  17. //监听接收透传消息事件,客户端接收到透传消息时(在系统通知栏中不显示消息),触发receive事件。
  18. plus.push.addEventListener(
  19. 'receive',
  20. msg => {
  21. console.log('监听接收透传消息事件->receive:', msg.payload);
  22. //使用页面间通信, 在需要接收的地方处理,可以根据msg内容发送不同的信息
  23. uni.$emit('unipush-message',msg);
  24. //其他业务逻辑处理,如:模拟更新角标数字
  25. this.mockReceivePushInfo(that);
  26. },
  27. false
  28. );
  29. //#endif
  30. },

四、绑定别名、标签等

由于uniPush的客户端中没有直接绑定别名、标签等的API,所以需要调用个推的服务端接口进行实现。注意单推和批量推送的接口区别,详情参考个推文档

1、获取token

  1. const http = require('./http.js');
  2. const signUtil = require('./signUtil.js');
  3. const appInfo = {
  4. appId:'xxx',
  5. appkey: 'xxx',
  6. AppSecret:'xxx',
  7. MasterSecret:'xxx'
  8. }
  9. const baseUrl = `https://restapi.getui.com/v2/${appInfo.appId}`;
  10. var authToken ='';
  11. /**
  12. * 获取token
  13. */
  14. function getToken(){
  15. console.log('获取 token 开始。。。');
  16. let tokenUrl = `${baseUrl}/auth`;
  17. let timestamp = signUtil.createTimeStamp();
  18. let sign = signUtil.getGetuiSign(appInfo.appkey,timestamp,appInfo.MasterSecret);
  19. let data = {
  20. appkey: appInfo.appkey,
  21. timestamp: timestamp,
  22. sign: sign
  23. };
  24. console.log('获取 token 的url:',tokenUrl);
  25. http.postJsonData(tokenUrl,data).then(res =>{
  26. console.log('获取token结果:',res);
  27. if(res.result === 0){
  28. authToken = res.authToken;
  29. }
  30. }).catch(e =>{
  31. console.error('获取token失败:',e);
  32. }).finally(()=>{
  33. console.log('获取token结束。。。');
  34. })
  35. }

2、根据CID推送

  1. /**
  2. * 向单个用户推送消息,可根据cid指定用户
  3. * @param {*} token
  4. */
  5. function sendNotificationToCid(token){
  6. console.log('sendNotificationToCid 开始。。。');
  7. let url = `${baseUrl}/push/single/cid`;
  8. let data = {
  9. "request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),
  10. "settings":{
  11. "ttl":3600000
  12. },
  13. "audience":{
  14. "cid":[
  15. "344a2566584425ca0546a76f41fa81de"
  16. ]
  17. },
  18. "push_message":{
  19. "notification":{
  20. "title":"会议邀请",
  21. "body":"应急管理局刘宝兴邀请您参加会议",
  22. "click_type":"intent",
  23. "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",
  24. "badge_add_num":"1"
  25. }
  26. },
  27. "push_channel":{
  28. "android":{
  29. "ups":{
  30. "notification":{
  31. "title":"会议邀请-android",
  32. "body":"应急管理局刘宝兴邀请您参加会议-android",
  33. "click_type":"intent",
  34. "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",
  35. "badge_add_num":"1"
  36. }
  37. }
  38. },
  39. "ios":{
  40. "type":"notify",
  41. "payload":"自定义消息",
  42. "aps":{
  43. "alert":{
  44. "title":"会议邀请-ios",
  45. "body":"应急管理局刘宝兴邀请您参加会议-ios"
  46. },
  47. "content-available":0
  48. },
  49. "auto_badge":"+1"
  50. }
  51. }
  52. }
  53. console.log('sendNotificationToCid 的url:',url);
  54. http.postJsonData(url,data,{token:token}).then(res =>{
  55. console.log('sendNotificationToCid结果:',res);
  56. }).catch(e =>{
  57. console.error('sendNotificationToCid失败:',e);
  58. });
  59. }
  1. /**
  2. * 通过cid推送透传消息
  3. * @param {*} token
  4. */
  5. function sendTransmissionToCid(token){
  6. console.log('sendTransmissionToCid 开始。。。');
  7. let url = `${baseUrl}/push/single/cid`;
  8. // 传递给app处理的参数
  9. let msg = {
  10. "targetType":"local",
  11. "businessType":"hidden-danger-identification-deploy",
  12. "targetPath":"/subpkg/pages/warning-notification/warning-notification?id=123&name=lbx",
  13. "ext":"ext",
  14. }
  15. let msg1 = {
  16. "targetType":"web",
  17. "businessType":"",
  18. "targetPath":"https://www.baidu.com",
  19. "ext":"百度",
  20. }
  21. //弹出系统通知的title和body内容
  22. let notification = {
  23. "title":"会议邀请",
  24. "body":"应急管理局刘宝兴邀请您参加会议1",
  25. }
  26. //目标cid
  27. let targetCid = '1f2dc41154fd90f55e38bed5b99ac443'
  28. let data = {
  29. "request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),
  30. "settings":{
  31. "ttl":3600000
  32. },
  33. "audience":{
  34. "cid":[
  35. targetCid
  36. ]
  37. },
  38. "push_message":{
  39. "transmission":JSON.stringify(msg),
  40. },
  41. "push_channel":{
  42. "android":{
  43. "ups":{
  44. "notification":{
  45. ...notification,
  46. "click_type":"intent",
  47. "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`,
  48. "badge_add_num":"1"
  49. }
  50. }
  51. },
  52. "ios":{
  53. "type":"notify",
  54. "payload":JSON.stringify(msg),
  55. "aps":{
  56. "alert":{
  57. ...notification
  58. },
  59. "content-available":0
  60. },
  61. "auto_badge":"+1"
  62. }
  63. }
  64. }
  65. console.log('sendTransmissionToCid 的url:',url);
  66. http.postJsonData(url,data,{token:token}).then(res =>{
  67. console.log('sendTransmissionToCid结果:',res);
  68. }).catch(e =>{
  69. console.error('sendTransmissionToCid失败:',e);
  70. });
  71. }

3、绑定别名

  1. /**
  2. * 绑定别名
  3. */
  4. function bindUserAlias(token){
  5. console.log('bindUserAlias 开始。。。');
  6. let url = `${baseUrl}/user/alias`;
  7. let data = {
  8. data_list:[
  9. {
  10. cid:'344a2566584425ca0546a76f41fa81de',
  11. alias:'1234567890_xiaomi'
  12. },
  13. {
  14. cid:'40dba2f9f5f0d4d19ef9e6667f2c00e4',
  15. alias:'1234567890_apple'
  16. },
  17. ]
  18. }
  19. http.postJsonData(url,data,{token:token}).then(res =>{
  20. console.log('bindUserAlias 结果:',res);
  21. }).catch(e =>{
  22. console.error('bindUserAlias 失败:',e);
  23. })
  24. }

4、根据别名推送

  1. /**
  2. * 通过别名推送透传消息
  3. * @param {*} token
  4. */
  5. function sendTransmissionToAlias(token){
  6. console.log('sendTransmissionToAlias 开始。。。');
  7. let url = `${baseUrl}/push/single/alias`;
  8. let data = {
  9. "request_id":"id-is-timestamp-"+signUtil.createTimeStamp(),
  10. "settings":{
  11. "ttl":3600000
  12. },
  13. "audience":{
  14. "alias":[
  15. "1234567890_xiaomi"
  16. ]
  17. },
  18. "push_message":{
  19. "transmission":JSON.stringify({
  20. id:'123',
  21. name:'lbx'
  22. }),
  23. },
  24. "push_channel":{
  25. "android":{
  26. "ups":{
  27. "notification":{
  28. "title":"会议邀请-android-alias",
  29. "body":"应急管理局刘宝兴邀请您参加会议-android-alias",
  30. "click_type":"intent",
  31. "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",
  32. "badge_add_num":"1"
  33. }
  34. }
  35. },
  36. "ios":{
  37. "type":"notify",
  38. "payload":"自定义消息",
  39. "aps":{
  40. "alert":{
  41. "title":"会议邀请-ios",
  42. "body":"应急管理局刘宝兴邀请您参加会议-ios"
  43. },
  44. "content-available":0
  45. },
  46. "auto_badge":"+1"
  47. }
  48. }
  49. }
  50. console.log('sendTransmissionToAlias 的url:',url);
  51. http.postJsonData(url,data,{token:token}).then(res =>{
  52. console.log('sendTransmissionToAlias结果:',res);
  53. }).catch(e =>{
  54. console.error('sendTransmissionToAlias失败:',e);
  55. });
  56. }

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界面录入的测试用户推送;审核中应用,只能用测试推送) :::

  1. const http = require('./http.js');
  2. const signUtil = require('./signUtil.js');
  3. const appInfo = {
  4. appId:'xxx',
  5. appkey: 'xxx',
  6. AppSecret:'xxxx'
  7. };
  8. //测试机的regId
  9. const testRegId = '16528632681006142081625';
  10. const baseUrl = 'https://api-push.vivo.com.cn';
  11. let tokenUrl = `${baseUrl}/message/auth`;
  12. console.log('tokenUrl = '+tokenUrl);
  13. let timestamp = signUtil.createTimeStamp();
  14. let sign = signUtil.getVivoSign(appInfo.appId,appInfo.appkey,timestamp,appInfo.AppSecret);
  15. let data = {
  16. appId:appInfo.appId,
  17. appKey: appInfo.appkey,
  18. timestamp: timestamp,
  19. sign: sign
  20. };
  21. var authToken = '08250f68-0fdc-47b4-8a5b-ddaa7d48c4ba';
  22. function getToken(){
  23. console.log('获取 token 开始。。。');
  24. http.postJsonData(tokenUrl,data).then(res =>{
  25. console.log('获取token结果:',res);
  26. if(res.result === 0){
  27. authToken = res.authToken;
  28. }
  29. }).catch(e =>{
  30. console.error('获取token失败:',e);
  31. }).finally(()=>{
  32. console.log('获取token结束。。。');
  33. })
  34. }
  35. function sendMessageToSingleUser(token){
  36. let url = `${baseUrl}/message/send`;
  37. let data = {
  38. "regId":testRegId,
  39. "notifyType":4,
  40. "title":"会议邀请",
  41. "content":"应急管理局刘宝兴邀请您参加会议",
  42. "timeToLive":86400,
  43. "skipType":4,
  44. "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",
  45. "networkType":"1",
  46. "clientCustomMap":{
  47. "id":"123",
  48. "name":"lbx"
  49. },
  50. "extra":{
  51. "callback":"http://www.vivo.com",
  52. "callback.param":"vivo"
  53. },
  54. "requestId":"25509283-3767-4b9e-83fe-b6e55ac6b123-"+timestamp,
  55. "pushMode":1
  56. };
  57. http.postJsonData(url,data,{authToken:token}).then(res =>{
  58. console.log('sendMessageToSingleUser结果:',res);
  59. }).catch(e =>{
  60. console.error('sendMessageToSingleUser失败:',e);
  61. });
  62. }
  63. if(authToken === ''){
  64. getToken();
  65. }else{
  66. sendMessageToSingleUser(authToken);
  67. }