一、引言

uni-app是支持消息推送的,参考如下文档:

UniPush介绍

UniPush使用指南

UniPush开通指南

如何自定义推送通知的图标?

在 uni-app 中使用 UniPush

二、效果

开源项目uniapp-admin

三、需求

不同角色的用户登陆App,收到不同的待办提醒。即谁处理这个待办任务,谁会收到这个提醒。对不同角色的用户推送待办消息

四、方案步骤

4.1 查看个推文档

因为uni-app的推送是集成了个推,所以查看个推文档接入方案

因为后台是java语言,所以查看java集成指南

  • 下载服务端SDK开发工具包,下载地址为:http://www.getui.com/download/docs/getui/server/GETUI_JAVA_SDK_4.1.0.5.zip

  • 导入"GETUI_SERVER_SDK\资源文件”目录下的所有jar包

# uni-push
mvn install:install-file -Dfile="gexin-rp-fastjson-1.0.0.3.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-fastjson -Dversion=1.0.0.3 -Dpackaging=jar
mvn install:install-file -Dfile="gexin-rp-sdk-base-4.0.0.30.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-base -Dversion=4.0.0.30 -Dpackaging=jar
mvn install:install-file -Dfile="gexin-rp-sdk-http-4.1.0.5.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-http -Dversion=4.1.0.5 -Dpackaging=jar
mvn install:install-file -Dfile="gexin-rp-sdk-template-4.0.0.24.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-template -Dversion=4.0.0.24 -Dpackaging=jar
mvn install:install-file -Dfile="protobuf-java-2.5.0.jar" -DgroupId=com.google.protobuf -DartifactId=protobuf-java -Dversion=2.5.0 -Dpackaging=jar
<!-- uni push -->
<dependency><groupId>com.gexin.platform</groupId><artifactId>gexin-rp-sdk-base</artifactId><version>4.0.0.30</version>
</dependency>
<dependency><groupId>com.gexin.platform</groupId><artifactId>gexin-rp-sdk-template</artifactId><version>4.0.0.24</version>
</dependency>
<dependency><groupId>com.gexin.platform</groupId><artifactId>gexin-rp-sdk-http</artifactId><version>4.1.0.5</version>
</dependency>
<dependency><groupId>com.gexin.platform</groupId><artifactId>gexin-rp-fastjson</artifactId><version>1.0.0.3</version>
</dependency>
<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>2.5.0</version>
</dependency>

4.2 编写服务端简单demo

按照UniPush开通指南,开通UniPush,获取appId、appKey等,编写下面简单demo,客户端就会收到消息啦~

客户端接收消息代码,参考4.3

public class AppPush {// STEP1:获取应用基本信息private static String appId = "";private static String appKey = "";private static String masterSecret = "";private static String url = "http://sdk.open.api.igexin.com/apiex.htm";public static void main(String[] args) throws IOException {IGtPush push = new IGtPush(url, appKey, masterSecret);Style0 style = new Style0();// STEP2:设置推送标题、推送内容style.setTitle("请输入通知栏标题");style.setText("请输入通知栏内容");// 注释采用默认图标// style.setLogo("push.png");  // 设置推送图标// STEP3:设置响铃、震动等推送效果style.setRing(true);  // 设置响铃style.setVibrate(true);  // 设置震动// STEP4:选择通知模板NotificationTemplate template = new NotificationTemplate();template.setAppId(appId);template.setAppkey(appKey);template.setStyle(style);// 点击消息打开应用template.setTransmissionType(1);// 传递自定义消息template.setTransmissionContent("自定义消息,可以是json字符串");// STEP5:定义"AppMessage"类型消息对象,设置推送消息有效期等推送参数List<String> appIds = new ArrayList<String>();appIds.add(appId);AppMessage message = new AppMessage();message.setData(template);message.setAppIdList(appIds);message.setOffline(true);message.setOfflineExpireTime(1000 * 600);  // 时间单位为毫秒// STEP6:执行推送IPushResult ret = push.pushMessageToApp(message);System.out.println(ret.getResponse().toString());}
}

4.3 客户端App.vue添加消息处理逻辑

/*** 处理推送消息*/
handlePush() {// #ifdef APP-PLUSconst _self = thisconst _handlePush = function(message) {// 获取自定义信息let payload = message.payloadtry {// JSON解析payload = JSON.parse(payload)// 携带自定义信息跳转应用页面uni.navigateTo({url: '/pages/xxx?data=' + JSON.stringify(payload)})} catch(e) {}}// 事件处理plus.push.addEventListener('click', _handlePush)plus.push.addEventListener('receive', _handlePush)// #endif
},

五、思考

应用确实接收到了消息,但是所有角色的用户都会接收到和自己不想关的待办任务消息。这是违背需求的!所以基于此,作者研究了服务端发送到客户端消息的原理:

实际上,消息不管是单推还是群推,推送的目标都是clientid,clientid标识每个客户端的身份

问题来了,怎么获取客户端的clientid呢?

六、最终方案

6.1 获取客户端clientid

经过查询资料,有一个api是getClientInfo方法,可以获取客户端信息,但是必须条件编译,因为是plus接口。

以下代码,用户登陆完成时,获取客户端信息(appid,appkey,clientid)用户信息(账户名、角色等)、其他信息,向服务端提交api请求,保存客户端clientid和角色的关联信息。

// 保存clientid到服务器
// #ifdef APP-PLUS
const clientInfo = plus.push.getClientInfo()
let pushUser = {clientid: clientInfo.clientid,appid: clientInfo.appid,appkey: clientInfo.appkey,userName: '用户名',userRole: '用户角色'
}
// 提交api请求,服务端保存客户端角色信息
Vue.prototype.$minApi.savePushUser(pushUser)
// #endif

6.2 服务端接收客户端角色信息处理

服务端接收到信息,根据自己的业务逻辑,保存或者更新,作者的处理逻辑时已经保存的clientid,不在新增,更新角色信息。

clientid和角色关系,数据库表结构

6.3 服务端根据不同角色发送待办提醒

改进消息发送方式,采用个推toList:简称“批量推”,指向制定的一批用户推送消息

/**
* @params pushMessage推送消息
* @params appPushList推送角色目标列表
*/
public static void pushMessage(PushMessage pushMessage, List<AppPush> appPushList) {IGtPush push = new IGtPush(url, appKey, masterSecret);Style0 style = new Style0();// STEP2:设置推送标题、推送内容style.setTitle(pushMessage.getTitle());style.setText(pushMessage.getContent());
//        style.setLogo("push.png"); // 设置推送图标// STEP3:设置响铃、震动等推送效果style.setRing(true);  // 设置响铃style.setVibrate(true);  // 设置震动// STEP4:选择通知模板NotificationTemplate template = new NotificationTemplate();template.setAppId(appId);template.setAppkey(appKey);template.setStyle(style);// 点击消息打开应用template.setTransmissionType(1);// 传递自定义消息template.setTransmissionContent(JSONUtil.toJsonStr(pushMessage));// STEP5:定义"AppMessage"类型消息对象,设置推送消息有效期等推送参数// 采用toList方案,定义ListMessage消息类型
//        List<String> appIds = new ArrayList<String>();
//        appIds.add(appId);ListMessage message = new ListMessage();message.setData(template);
//        message.setAppIdList(appIds);message.setOffline(true);message.setOfflineExpireTime(1000 * 600);  // 时间单位为毫秒String contentId = push.getContentId(message);// 获取推送目标List targets = new ArrayList();for (AppPush ap : appPushList) {Target target = new Target();target.setAppId(appId);target.setClientId(ap.getClientid());targets.add(target);}// STEP6:执行推送,不采用toApp方案,采用toList方案
//        IPushResult ret = push.pushMessageToApp(message);IPushResult ret = push.pushMessageToList(contentId, targets);System.out.println(ret.getResponse().toString());
}

PushMessage类是一个model

public class PushMessage {private String title;private String content;// 用户角色private String userRole;// 其他对象// 省略,getter setter方法
}

AppPush类是数据库表映射类

public class AppPushprivate String appid;//appidprivate String appkey;//appkeyprivate String clientid;//clientidprivate String userName;//账户private String userRole;//用户角色// 其他对象// 省略,getter setter方法
}

七、自定义通知图标

在客户端manifest.json文件中的sdkConfigs中添加如下配置,图标自己添加

/* SDK配置 */
"sdkConfigs" : {"push" : {"unipush" : {"icons": {"push": {"ldpi": "unpackage/res/icons/48x48.png","mdpi": "unpackage/res/icons/48x48.png","hdpi" : "unpackage/res/icons/72x72.png","xhdpi" : "unpackage/res/icons/96x96.png","xxhdpi" : "unpackage/res/icons/144x144.png","xxxhdpi" : "unpackage/res/icons/192x192.png"},"small": {"ldpi": "unpackage/res/icons/18x18.png","mdpi": "unpackage/res/icons/24x24.png","hdpi": "unpackage/res/icons/36x36.png","xhdpi": "unpackage/res/icons/48x48.png","xxhdpi": "unpackage/res/icons/72x72.png"}
}
}}
},

八、开源项目

开源项目uniapp-admin

开源不易,且用且珍惜!

赞助作者,互相交流

转载请注明:溜爸 » uni-app消息推送方案

uni-app消息推送方案相关推荐

  1. uniapp APP消息推送方案

    提示:本文实例消息推送使用uniapp官方的unipush推送: 项目场景:该项目是uniapp + uniCloud 项目,APP端的消息推送使用 html+ 与原生实现交互 1.开通推送消息 – ...

  2. APP消息推送方案调研

    1. 背景 目前行业内有多家消息推送服务供应商,且各家都宣称自家产品的核心指标行业领先.为了不被各家推送厂商忽悠,量化消息推送到达率效果,我们需要整理设计一套消息推送服务对比量化方案,一切以线上实测数 ...

  3. 如何构建一套高可用的 APP 消息推送平台

    转载自  如何构建一套高可用的 APP 消息推送平台 消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行 ...

  4. 国内APP消息推送机制以及微信消息延迟问题剖析

    转自:https://club.huawei.com/thread-15878044-1-1.html 一.前言 随着安卓手机以及QQ/微信/支付宝/滴滴出行/美图外卖等一大批移动通信/移动消费应用的 ...

  5. 关于 APP 消息推送,看这篇文章就够辣!!

    原链接:http://www.sohu.com/a/168278657_251759 APP消息推送作为消息分发渠道,一方面起到内容告知的作用,另一方面在一定程度上可以提高用户活跃,在用户流失后也许能 ...

  6. 前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)

    前提概述:此文章都是基于uniapp中uniPush2实现的在线.离线推送 app消息推送流程 登录开发者中心先填写好项目信息以及配置厂商 在manifest.json文件中勾选推送模块 打包自定义基 ...

  7. IOS开发之实现App消息推送(最新)

    IOS开发之实现App消息推送(最新) 标签: 推送最新AppStoreXCode6ios开发 2014-11-19 21:13  58412人阅读  评论(77)  收藏  举报   分类: IOS ...

  8. APP消息推送测试点

    APP消息推送测试点 2019.03.15 17:38:39 字数 190 阅读 50 消息推送对象 1.单个推送 2.多个推送 3.及安卓和IOS渠道推送 ps: 注意生产环境和测试环境的分开,避免 ...

  9. 利用MUI+个推实现APP消息推送

    利用MUI+个推实现APP消息推送 从2015年7月开始使用MUI进行APP的开发,到现在已经有一个年头了.而以前做过的东西都没有整理过,以后会将自己遇到的坑整理下来. 这篇主要是讲利用MUI和集成的 ...

最新文章

  1. 树莓派:外设开发编程,控制继电器
  2. java 生成折线图_jfree jsp java 生成折线图(详解带jar)
  3. 【VS开发】static、extern分析总结
  4. _Linux中功能强大的截图工具 - Flameshot
  5. 吴恩达《机器学习》学习笔记三——多变量线性回归
  6. linux远程开启不挂起的服务
  7. ROS : 修改ROS源代码(overlaying package)
  8. 计算机VFP输出方式有哪几种,VFP导出数据的方法大全
  9. 中国开源正在走向成熟
  10. Dijkstra算法求单源最短路径
  11. keil(arm)中配置c99方法 及 C99特性
  12. 通达OA应对后门检测的临时方法
  13. 怎么看rx580是不是470刷的_【BIOS】网上都没有的教程 RX470 RX480 RX570 RX580显卡BIOS刷黑了怎么办?自救方法...
  14. robots.txt文件信息泄漏
  15. 试用分析一国宏观经济内外均衡的过程及其政策搭配
  16. c语言转义字符详解,C语言转义字符和格式控制符参考
  17. imagenet 1000分类
  18. 高效能屌丝创业者的七项习惯
  19. UMS512(T)平台最大支持的RAM和ROM是多少?
  20. 苹果手机应用分身_G胖串流应用上架App Store,苹果手机能玩电脑游戏了

热门文章

  1. 中考化学计算机题教案,初三化学教案:化学反应中的有关计算
  2. Autosar XCP在INCA中的使用
  3. 寻找蒙赫阵列(monge array)的每行的最小值
  4. android seetaface6_中科视拓宣布开源SeetaFace6人脸识别算法(附相关课程)
  5. Altium Designer绘制stm32电路原理图
  6. 快速上手百度大脑驾驶行为分析
  7. android 重力感应和屏幕旋转关系
  8. 软考高级系统架构设计师系列论文二:论软件的性能优化设计
  9. 今日大暑——“小暑大暑,上蒸下煮”
  10. HTML/CSS自制网页