当前位置:   article > 正文

uniapp使用unipush推送及java后台推送代码(含本地打包apk使用unipush推送)_unipush使用后端

unipush使用后端

你懂的,又是项目用到了,作为程序猿义无反顾需要定时 “进化” ,硬头皮去写,虽然曾经作为android开发者写了很多的推送,但是uniapp的推送也是有所差异的,记录一下,以后留用。

首先uniapp的推送uniPush 是 DCloud 联合个推公司推出的集成型统一推送服务,也就是你不用挑了,就个推了。

其次unipush分1.0版本和2.0版本,这点非常重要,完全不同的概念,不要认为只是简单的升级版。

1.0版本:是传统的推送方式,客户端与服务器端均需要集成个推的服务,由服务器向个推服务器发请求来操作相关推送功能。

2.0版本:就没有你的服务器的事了,相当于是云操作的概念,也就是uniCloud云端一体,也肯定也是uniapp云端技术的必然趋势,功能也很强大,还自带web控制台,既然少了服务器的事,自然流程就简单了。

所以务必根据你的业务需求合理选择版本,本人也是第一次写,想着感受下新版本,结果快写完了,意识到不对劲了,2.0不适合我这次的项目需求,果然换回1.0版本。所以本文仍是介绍1.0版本的使用,以及如果你的uniapp基于本地打包成app,又是如何调整使用。

先说正常情况下(非打包apk)的unipush 1.0的使用

一、开通unipush推送服务

当你新建了uniapp项目之后,选择 manifest.json 中的App模块配置,然后勾选 Push(消息推送)以及对应的版本,这里是unipush 1.0

 然后点击配置,进入到Dcloud开发者中心

这里我不介绍ios相关的,所以可以把选择平台中的IOS取消勾选。这里可以看到需要填写包名及签名。

关于打包,如果你是使用云打包

你也就看到你的包名其实就是uni.你的AppID,就是上方圈出的东西,把它填入到包名那一栏,记得打包时勾选使用Dcloud老版证书。这样一来,你再看下开发者中心签名那一栏的介绍,上面是不是说,如果你使用云打包,并且使用老版证书,签名填什么,它已经告诉你了,复制那段签名填入到签名那栏即可。

最后点击开通应用,开通成功会有弹窗提示。

 二、推送相关知识

写推送,你必须先要了解推送。像传统推送或者说这种实时传递少量信息(即时通讯),无非是:

1. 轮询方式,也就是定时进行http请求来查询有没有消息要传过来啊,这方式是最笨的方式。

2. 短信,壕 ,请随意

3. 长连接 ,虽然长连接到现在也成熟,但对于手机而言嘛,这种性能消耗还是巨大的。毕竟也不是聊天或者直播。

还好,市面上成熟的第三方推送也早就出现了,例如:极光推送,阿里云推送,个推等,这里不作扩展哈,只是提下。因为有很多人一直从事后台或者非手机端的网页技术开发,对手机推送并不了解,甚至不知道推送是啥。

如图,就是你时而喜欢时而厌烦的手机状态栏的各种弹窗,可以是广告,可以是更新通知,可以是某信消息,也可以是短信等等。而推送并不是仅仅指弹窗,这个弹窗是android自带的功能,也就是notification(通知), 你可以不借助任何推送技术,就可以让自己手机弹出这类弹窗,甚至带上各种图标,音效,震动等。而推送是为了实时传递数据给手机,让手机知道我要开始弹弹窗了,弹窗上显示的内容是什么,或者点击这个弹窗要干嘛,听懂掌声!

其次简说下推送原理,技术架构,我直接拿unipush原图,我画画也不行

说白了,就是你的手机先与unipush服务器(推送服务器)建立连接,这个基本上是通过一个唯一的识别标识建立的,在这里也就是所谓的clientId(cid)。然后你的java服务器集成过推送服务后,就可以通过发请求调用推送服务器的api告诉它,我要给cid是xx的手机推送一条xxx消息,推送服务器就可以通过cid给该台手机推送数据了。

你也看到了,我说的都是手机,设备,而不是说某个人,某个账号。因为账号往往都是咱们自己的服务器的一套账号系统。所以你想要更丰富的推送方式,或者与自己的账号系统关联(也可以直接拿cid设备标识传给自己服务器绑定),那就需要与cid相关的一套其他推送方式了,也就衍生出了别名(alias),标签(tag)。有的第三方推送还有更丰富的方式,但大同小异,一般都具有别名,标签这类的方式。

别名(alias) ,一般用于与自己的账号关联。可以是用户的账号,昵称,邮箱,手机号均可,看你自己的需求了。

标签(tag),一般用于自己账号系统的分组,比如给某一类用户集体推送,或者某一分组下的用户集体推送等。

最后,你还要明白,推送一般分为两种,一种叫通知,一种叫消息(unipush这里叫透传消息)。这俩的区别在于,一个只是为了起到提醒的作用,一个是为了传递数据或者自定义业务逻辑、样式等。

通知就比较简单,粗暴,一般就传个标题,内容即可,然后自动显示在手机上,比如用于提醒用户需要更新软件了,您有新消息,新回复等。 

透传消息, 一般你可以自定义数据格式,但json用的居多,其次,你的手机收到透传消息后,不会像通知一样自动弹窗,而是什么反应都没有,只是接收到了数据,你需要根据业务自己弹出弹窗,或者进行后续操作。

个推的流程与其他第三方推送有些许不一样,你需要在app一运行就要获取到cid,然后Java后台写一个接口,app把cid传递给后台服务器,后台服务器来进行cid与别名,标签进行绑定。当用户退出登录后,记得要解绑,否则如果有账号多台设备登录,会有推送错乱的情况。

好了,到这基本上了解这些也就足够了。继续搞代码!

三、uniapp获取clientId与unipush建立联系

我们首先应在App第一次运行的时候,获取clientId,代码如下

  1. getClient: (callback) => {
  2. // #ifdef APP-PLUS
  3. let clientInfo = plus.push.getClientInfo(); //获取 clientID
  4. uni.setStorageSync('clientid', clientInfo.clientid) //缓存到本地
  5. console.log(clientInfo);
  6. // #endif
  7. }

四、监听收到推送时的处理

我们除了需要获取到cid之外,还需要配置好如何处理收到的推送消息,这里有的代码是借鉴别人的(具体谁的真不清楚了。。。),加自己的微调整。然后为了方便整体放到到了一个js文件中 unipush.js

  1. export default {
  2. init: () => {
  3. // #ifdef APP-PLUS
  4. plus.push.setAutoNotification(true); //设置通知栏显示通知 //必须设置
  5. plus.push.addEventListener("click", function(msg) {
  6. plus.push.clear(); //清空通知栏
  7. pushHandle(msg) //处理方法
  8. }, false);
  9. // 监听在线消息事件
  10. plus.push.addEventListener("receive", function(msg) {
  11. console.log("receive:"+JSON.stringify(msg));
  12. if (plus.os.name=='iOS') { //由于IOS 必须要创建本地消息 所以做这个判断
  13. if (msg.payload&& msg.payload!=null&&msg.type=='receive') {
  14. console.log(msg);
  15. // {"title": "xxx","content": "xxx","payload": "xxx"} 符合这种 才会自动创建消息 文档地址https://ask.dcloud.net.cn/article/35622
  16. plus.push.createMessage(msg.title,msg.content,JSON.stringify(msg.payload)) //创建本地消息
  17. }
  18. }
  19. if (plus.os.name=='Android') {
  20. let options={
  21. cover:false,
  22. sound:"system",
  23. title:msg.title
  24. }
  25. plus.push.createMessage(msg.content,msg.payload.content,options);
  26. // if(!msg.title||!msg.content||!msg.payload){ // 不符合自动创建消息的情况
  27. // //这里根据你消息字段来创建消息
  28. // console.log("这里根据你消息字段来创建消息:"+msg.title+","+msg.content+","+msg.payload);
  29. // plus.push.createMessage(msg.payload.content,JSON.stringify(msg.payload)) //创建本地消息
  30. // }else{
  31. // //符合自动创建消息
  32. // console.log("符合自动创建消息"+msg.title+","+msg.content+","+msg.payload);
  33. // pushHandle(msg)
  34. // }
  35. }
  36. }, false);
  37. // #endif
  38. },
  39. getClient: (callback) => {
  40. // #ifdef APP-PLUS
  41. let clientInfo = plus.push.getClientInfo(); //获取 clientID
  42. uni.setStorageSync('clientid', clientInfo.clientid)
  43. console.log(clientInfo);
  44. // #endif
  45. },
  46. }
  47. const pushHandle = (msg) => {
  48. if (typeof (msg.payload )=='string') { //如果是字符串,表示是ios创建的 要转换一下
  49. msg.payload=JSON.parse(msg.payload )
  50. }
  51. if(!msg) return false;
  52. plus.runtime.setBadgeNumber(0); //清除app角标
  53. //下面的代码根据自己业务来写 这里可以写跳转业务代码
  54. //跳转到tab
  55. if (msg.payload.pathType == '1') {
  56. uni.switchTab({
  57. url: msg.payload.url
  58. })
  59. }
  60. //跳转到详情
  61. if (msg.payload.pathType == 0) {
  62. let url = msg.payload.url
  63. if (msg.payload.args) {
  64. url = url + '?id=' + msg.payload.args
  65. }
  66. console.log(url);
  67. uni.navigateTo({
  68. url: url
  69. })
  70. }
  71. }

最后在App.vue里加入如下代码即可

  1. <script>
  2. import push from 'push/unipush.js';
  3. export default {
  4. onLaunch: function() {
  5. console.log('App Launch');
  6. push.getClient();
  7. push.init();
  8. },
  9. onShow: function() {
  10. console.log('App Show')
  11. },
  12. onHide: function() {
  13. console.log('App Hide')
  14. }
  15. }
  16. </script>
  17. <style>
  18. /*每个页面公共css */
  19. </style>

至此,手机端代码已经完成。还算简单。接下来是java服务器端

五、Java服务器端集成推送

获取秘钥等相关信息,来到开发者中心,在消息推送 -> 配置管理 -> 应用配置里有秘钥相关信息 

我的后台是Springboot,所以在application.yml下填写如下配置即可

然后在pom.xml中集成个推的sdk

  1. <dependency>
  2. <groupId>com.getui.push</groupId>
  3. <artifactId>restful-sdk</artifactId>
  4. <version>1.0.0.8</version>
  5. </dependency>

六、创建推送配置类GTPushConfig

  1. import com.getui.push.v2.sdk.ApiHelper;
  2. import com.getui.push.v2.sdk.GtApiConfiguration;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class GTPushConfig {
  8. // @Value("https://restapi.getui.com/v2")
  9. // private String baseUrl;
  10. @Value("${uniPush.appId}")
  11. private String appId;
  12. @Value("${uniPush.appKey}")
  13. private String appKey;
  14. @Value("${uniPush.masterSecret}")
  15. private String masterSecret;
  16. @Bean(name = "myApiHelper")
  17. public ApiHelper apiHelper() {
  18. GtApiConfiguration apiConfiguration = new GtApiConfiguration();
  19. //填写应用配置
  20. apiConfiguration.setAppId(appId);
  21. apiConfiguration.setAppKey(appKey);
  22. apiConfiguration.setMasterSecret(masterSecret);
  23. // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
  24. //默认为https://restapi.getui.com/v2
  25. //apiConfiguration.setDomain("https://restapi.getui.com/v2/");
  26. // 实例化ApiHelper对象,用于创建接口对象
  27. ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
  28. return apiHelper;
  29. }
  30. }

七、封装推送工具类PushUtil及推送消息实体类

推送消息实体类

  1. @Data
  2. public class PushReqBean implements Serializable {
  3. //消息类型 0代表透传消息(使用这个,需要手机自己弹出通知,定义通知样式,content为json串) 1代表是通知(使用这个,标题和内容即手机上显示的通知标题和内容)
  4. private Integer noticeType;
  5. //推送用户类型 0 全部用户 1根据cid推送 2根据别名 3根据标签
  6. private Integer userType;
  7. //用户标识,可为cid,别名,tag,多个之间逗号隔开
  8. private String user;
  9. //推送标题
  10. private String title;
  11. //推送内容
  12. private String content;
  13. }

api调用结果封装实体类(可不要)

  1. @Data
  2. public class ResultBean implements Serializable {
  3. public int code;
  4. public String msg;
  5. public Object data;
  6. }

推送工具类,这个里面,我几乎把所有的功能都融入进去了,比如绑定别名,批量绑定,绑定标签,解绑,根据各种方式推送通知,根据各种方式推送透传消息等。

  1. import com.getui.push.v2.sdk.ApiHelper;
  2. import com.getui.push.v2.sdk.api.PushApi;
  3. import com.getui.push.v2.sdk.api.UserApi;
  4. import com.getui.push.v2.sdk.common.ApiResult;
  5. import com.getui.push.v2.sdk.dto.req.*;
  6. import com.getui.push.v2.sdk.dto.req.message.PushDTO;
  7. import com.getui.push.v2.sdk.dto.req.message.PushMessage;
  8. import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
  9. import com.getui.push.v2.sdk.dto.res.QueryCidResDTO;
  10. import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
  11. import com.google.gson.JsonObject;
  12. import com.njlift.wechat.common.Result;
  13. import com.njlift.wechat.entity.PushReqBean;
  14. import org.springframework.stereotype.Component;
  15. import javax.annotation.Resource;
  16. import java.util.*;
  17. @Component
  18. public class PushUtil {
  19. @Resource(name = "myApiHelper")
  20. private ApiHelper myApiHelper;
  21. /**
  22. * 绑定别名
  23. * @param cid 用户在推送服务器的唯一识别标志
  24. * @param alias 在自己服务器上的唯一识别标志
  25. * @return 绑定结果
  26. */
  27. public Result bindAlias(String cid,String alias){
  28. Result rb=new Result();
  29. CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
  30. CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
  31. cidAlias.setCid(cid);
  32. cidAlias.setAlias(alias);
  33. cidAliasListDTO.add(cidAlias);
  34. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  35. ApiResult<Void> voidApiResult = userApi.bindAlias(cidAliasListDTO);
  36. rb.setCode(voidApiResult.getCode());
  37. rb.setMsg(voidApiResult.getMsg());
  38. rb.setData(voidApiResult.getData());
  39. return rb;
  40. }
  41. /**
  42. * 批量解绑别名
  43. * @param aliasList 别名列表
  44. * @return 解绑结果
  45. *
  46. */
  47. public Result unbindAlias(List<String> aliasList){
  48. Result rb=new Result();
  49. List<CidAliasListDTO.CidAlias> list=new ArrayList<>();
  50. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  51. for (String alias:aliasList){
  52. ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
  53. if (queryCidResDTOApiResult.isSuccess()){
  54. List<String> cidList = queryCidResDTOApiResult.getData().getCid();
  55. for (String cid:cidList){
  56. CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
  57. cidAlias.setAlias(alias);
  58. cidAlias.setCid(cid);
  59. list.add(cidAlias);
  60. }
  61. }
  62. }
  63. CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
  64. cidAliasListDTO.setDataList(list);
  65. ApiResult<Void> voidApiResult = userApi.batchUnbindAlias(cidAliasListDTO);
  66. rb.setCode(voidApiResult.getCode());
  67. rb.setMsg(voidApiResult.getMsg());
  68. rb.setData(voidApiResult.getData());
  69. return rb;
  70. }
  71. /**
  72. * 一个用户根据cid进行绑定tag标签(次数限制)
  73. * @param cid 用户在推送服务器的唯一识别标志
  74. * @param tag 标签名
  75. * @return 绑定结果
  76. */
  77. public Result userBindTagsByCid(String cid,String tag){
  78. Result rb=new Result();
  79. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  80. TagDTO dto=new TagDTO();
  81. dto.addTag(tag);
  82. ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
  83. rb.setCode(voidApiResult.getCode());
  84. rb.setMsg(voidApiResult.getMsg());
  85. rb.setData(voidApiResult.getData());
  86. return rb;
  87. }
  88. /**
  89. * 一个用户根据别名进行绑定tag标签(次数限制)
  90. * @param alias 在自己服务器上的唯一识别标志
  91. * @param tag 标签名
  92. * @return 绑定结果
  93. */
  94. public Result userBindTagsByAlias(String alias,String tag){
  95. Result rb=new Result();
  96. rb.setCode(1);
  97. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  98. ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
  99. if (queryCidResDTOApiResult.isSuccess()){
  100. List<String> cidList = queryCidResDTOApiResult.getData().getCid();
  101. if (cidList.size()==1){
  102. String cid = cidList.get(0);
  103. TagDTO dto=new TagDTO();
  104. dto.addTag(tag);
  105. ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
  106. rb.setCode(voidApiResult.getCode());
  107. rb.setMsg(voidApiResult.getMsg());
  108. rb.setData(voidApiResult.getData());
  109. }else {
  110. rb.setMsg("该别名对应多个cid,无法绑定标签");
  111. }
  112. }else {
  113. rb.setMsg(queryCidResDTOApiResult.getMsg());
  114. }
  115. return rb;
  116. }
  117. /**
  118. * 一批用户绑定tag标签(每分钟100次,每日10000次)
  119. * @param cidList 用户在推送服务器的唯一识别标志
  120. * @param tag 标签名
  121. * @return 绑定结果
  122. */
  123. public Result userBindTagsByAlias(List<String> cidList,String tag){
  124. Result rb=new Result();
  125. rb.setCode(1);
  126. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  127. UserDTO userDTO=new UserDTO();
  128. Set<String> cidSet=new HashSet<>(cidList);
  129. userDTO.setCid(cidSet);
  130. ApiResult<Map<String, String>> mapApiResult = userApi.usersBindTag(tag, userDTO);
  131. rb.setCode(mapApiResult.getCode());
  132. rb.setMsg(mapApiResult.getMsg());
  133. rb.setData(mapApiResult.getData());
  134. return rb;
  135. }
  136. /**
  137. * 批量用户解绑一个标签
  138. * @param list 用户集合(可cid集合或alias集合)
  139. * @param type 0表示alias集合,1表示cid集合
  140. * @param tag 标签
  141. * @return 解绑结果
  142. */
  143. public Result usersUnbindTag(List<String> list,int type,String tag){
  144. Result rb=new Result();
  145. rb.setCode(1);
  146. UserApi userApi = myApiHelper.creatApi(UserApi.class);
  147. UserDTO userDTO=new UserDTO();
  148. List<String> cidList=new ArrayList<>();
  149. if (type==0){
  150. for (String alias:list){
  151. ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
  152. if (queryCidResDTOApiResult.isSuccess()){
  153. cidList.addAll(queryCidResDTOApiResult.getData().getCid());
  154. }
  155. }
  156. }else {
  157. cidList.addAll(list);
  158. }
  159. Set<String> cidSet=new HashSet<>(cidList);
  160. userDTO.setCid(cidSet);
  161. ApiResult<Map<String, String>> mapApiResult = userApi.deleteUsersTag(tag, userDTO);
  162. rb.setCode(mapApiResult.getCode());
  163. rb.setMsg(mapApiResult.getMsg());
  164. rb.setData(mapApiResult.getData());
  165. return rb;
  166. }
  167. /**
  168. * 群推透传消息
  169. * @param bean 推送信息
  170. * @return 结果
  171. */
  172. public Result pushMessageToAll(PushReqBean bean){
  173. Result rb=new Result();
  174. PushDTO<String> pushDTO = new PushDTO<String>();
  175. pushDTO.setRequestId(System.currentTimeMillis() + "");
  176. pushDTO.setAudience("all");
  177. PushMessage pushMessage = new PushMessage();
  178. JsonObject jsonObject=new JsonObject();
  179. jsonObject.addProperty("m_title",bean.getTitle());
  180. jsonObject.addProperty("m_content",bean.getContent());
  181. pushMessage.setTransmission(jsonObject.toString());
  182. pushDTO.setPushMessage(pushMessage);
  183. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  184. ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
  185. rb.setCode(apiResult.getCode());
  186. rb.setMsg(apiResult.getMsg());
  187. rb.setData(apiResult.getData());
  188. return rb;
  189. }
  190. /**
  191. * 根据cid推送消息(含批量)
  192. * @param bean 推送信息
  193. * @return 结果
  194. */
  195. public Result pushMessageToCid(PushReqBean bean){
  196. boolean isMany=bean.getUser().contains(",");
  197. if (isMany){
  198. return pushMessageToManyCid(bean);
  199. }else {
  200. return pushMessageToSingleCid(bean);
  201. }
  202. }
  203. /**
  204. * 根据别名推送消息(含批量)
  205. * @param bean 推送信息
  206. * @return 结果
  207. */
  208. public Result pushMessageToAlias(PushReqBean bean){
  209. boolean isMany=bean.getUser().contains(",");
  210. if (isMany){
  211. return pushMessageToManyAlias(bean);
  212. }else {
  213. return pushMessageToSingleAlias(bean);
  214. }
  215. }
  216. //根据cid单推消息
  217. private Result pushMessageToSingleCid(PushReqBean bean){
  218. Result rb=new Result();
  219. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  220. pushDTO.setRequestId(System.currentTimeMillis() + "");
  221. PushMessage pushMessage = new PushMessage();
  222. JsonObject jsonObject=new JsonObject();
  223. jsonObject.addProperty("m_title",bean.getTitle());
  224. jsonObject.addProperty("m_content",bean.getContent());
  225. pushMessage.setTransmission(jsonObject.toString());
  226. pushDTO.setPushMessage(pushMessage);
  227. Audience audience = new Audience();
  228. audience.addCid(bean.getUser());
  229. pushDTO.setAudience(audience);
  230. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  231. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
  232. rb.setCode(apiResult.getCode());
  233. rb.setMsg(apiResult.getMsg());
  234. rb.setData(apiResult.getData());
  235. return rb;
  236. }
  237. //批量根据cid推送消息
  238. private Result pushMessageToManyCid(PushReqBean bean){
  239. Result rb = new Result();
  240. PushDTO pushDTO=new PushDTO();
  241. PushMessage pushMessage = new PushMessage();
  242. JsonObject jsonObject=new JsonObject();
  243. jsonObject.addProperty("m_title",bean.getTitle());
  244. jsonObject.addProperty("m_content",bean.getContent());
  245. pushMessage.setTransmission(jsonObject.toString());
  246. pushDTO.setPushMessage(pushMessage);
  247. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  248. ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
  249. if (msg.isSuccess()){
  250. AudienceDTO audienceDTO=new AudienceDTO();
  251. audienceDTO.setTaskid(msg.getData().getTaskId());
  252. audienceDTO.setAsync(true);
  253. List<String> users = Arrays.asList(bean.getUser().split(","));
  254. Audience audience=new Audience();
  255. for (String user:users){
  256. audience.addCid(user);
  257. }
  258. audienceDTO.setAudience(audience);
  259. PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
  260. ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
  261. rb.setCode(mapApiResult.getCode());
  262. rb.setMsg(mapApiResult.getMsg());
  263. rb.setData(mapApiResult.getData());
  264. }else {
  265. rb.setCode(msg.getCode());
  266. rb.setMsg(msg.getMsg());
  267. rb.setData(msg.getData());
  268. }
  269. return rb;
  270. }
  271. //根据别名单推消息
  272. private Result pushMessageToSingleAlias(PushReqBean bean){
  273. Result rb=new Result();
  274. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  275. pushDTO.setRequestId(System.currentTimeMillis() + "");
  276. PushMessage pushMessage = new PushMessage();
  277. JsonObject jsonObject=new JsonObject();
  278. jsonObject.addProperty("m_title",bean.getTitle());
  279. jsonObject.addProperty("m_content",bean.getContent());
  280. pushMessage.setTransmission(jsonObject.toString());
  281. pushDTO.setPushMessage(pushMessage);
  282. Audience audience = new Audience();
  283. audience.addAlias(bean.getUser());
  284. pushDTO.setAudience(audience);
  285. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  286. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
  287. rb.setCode(apiResult.getCode());
  288. rb.setMsg(apiResult.getMsg());
  289. rb.setData(apiResult.getData());
  290. return rb;
  291. }
  292. //批量根据别名推送消息
  293. private Result pushMessageToManyAlias(PushReqBean bean){
  294. Result rb = new Result();
  295. PushDTO pushDTO=new PushDTO();
  296. PushMessage pushMessage = new PushMessage();
  297. JsonObject jsonObject=new JsonObject();
  298. jsonObject.addProperty("m_title",bean.getTitle());
  299. jsonObject.addProperty("m_content",bean.getContent());
  300. pushMessage.setTransmission(jsonObject.toString());
  301. pushDTO.setPushMessage(pushMessage);
  302. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  303. ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
  304. if (msg.isSuccess()){
  305. AudienceDTO audienceDTO=new AudienceDTO();
  306. audienceDTO.setTaskid(msg.getData().getTaskId());
  307. audienceDTO.setAsync(true);
  308. List<String> users = Arrays.asList(bean.getUser().split(","));
  309. Audience audience=new Audience();
  310. for (String user:users){
  311. audience.addAlias(user);
  312. }
  313. audienceDTO.setAudience(audience);
  314. PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
  315. ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
  316. rb.setCode(mapApiResult.getCode());
  317. rb.setMsg(mapApiResult.getMsg());
  318. rb.setData(mapApiResult.getData());
  319. }else {
  320. rb.setCode(msg.getCode());
  321. rb.setMsg(msg.getMsg());
  322. rb.setData(msg.getData());
  323. }
  324. return rb;
  325. }
  326. //根据标签推送消息
  327. public Result pushMessageToTag(PushReqBean bean){
  328. Result rb=new Result();
  329. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  330. pushDTO.setRequestId(System.currentTimeMillis() + "");
  331. PushMessage pushMessage = new PushMessage();
  332. JsonObject jsonObject=new JsonObject();
  333. jsonObject.addProperty("m_title",bean.getTitle());
  334. jsonObject.addProperty("m_content",bean.getContent());
  335. pushMessage.setTransmission(jsonObject.toString());
  336. pushDTO.setPushMessage(pushMessage);
  337. Audience audience = new Audience();
  338. Condition condition=new Condition();
  339. condition.setKey("custom_tag");
  340. List<String> tags=new ArrayList<>();
  341. if (bean.getUser().contains(",")){
  342. tags.addAll(Arrays.asList(bean.getUser().split(",")));
  343. }else {
  344. tags.add(bean.getUser());
  345. }
  346. Set<String> sets=new HashSet<>();
  347. for (String tag:tags){
  348. sets.add(tag);
  349. }
  350. condition.setValues(sets);
  351. condition.setOptType("and");
  352. audience.addCondition(condition);
  353. pushDTO.setAudience(audience);
  354. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  355. ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
  356. rb.setCode(apiResult.getCode());
  357. rb.setMsg(apiResult.getMsg());
  358. rb.setData(apiResult.getData());
  359. return rb;
  360. }
  361. /**
  362. * 群推通知
  363. * @param bean 推送信息
  364. * @return 结果
  365. */
  366. public Result pushNoticeToAll(PushReqBean bean){
  367. Result rb=new Result();
  368. PushDTO<String> pushDTO = new PushDTO<String>();
  369. pushDTO.setRequestId(System.currentTimeMillis() + "");
  370. pushDTO.setAudience("all");
  371. PushMessage pushMessage = new PushMessage();
  372. GTNotification notification = new GTNotification();
  373. notification.setTitle(bean.getTitle());
  374. notification.setBody(bean.getContent());
  375. notification.setClickType("none");
  376. pushMessage.setNotification(notification);
  377. pushDTO.setPushMessage(pushMessage);
  378. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  379. ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
  380. rb.setCode(apiResult.getCode());
  381. rb.setMsg(apiResult.getMsg());
  382. rb.setData(apiResult.getData());
  383. return rb;
  384. }
  385. /**
  386. * 根据cid推送通知(含批量)
  387. * @param bean 推送信息
  388. * @return 结果
  389. */
  390. public Result pushNoticeToCid(PushReqBean bean){
  391. boolean isMany=bean.getUser().contains(",");
  392. if (isMany){
  393. return pushNoticeToManyCid(bean);
  394. }else {
  395. return pushNoticeToSingleCid(bean);
  396. }
  397. }
  398. /**
  399. * 根据别名推送通知(含批量)
  400. * @param bean 推送信息
  401. * @return 结果
  402. */
  403. public Result pushNoticeToAlias(PushReqBean bean){
  404. boolean isMany=bean.getUser().contains(",");
  405. if (isMany){
  406. return pushNoticeToManyAlias(bean);
  407. }else {
  408. return pushNoticeToSingleAlias(bean);
  409. }
  410. }
  411. //根据cid单推通知
  412. private Result pushNoticeToSingleCid(PushReqBean bean){
  413. Result rb=new Result();
  414. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  415. pushDTO.setRequestId(System.currentTimeMillis() + "");
  416. PushMessage pushMessage = new PushMessage();
  417. GTNotification notification = new GTNotification();
  418. notification.setTitle(bean.getTitle());
  419. notification.setBody(bean.getContent());
  420. notification.setClickType("none");
  421. pushMessage.setNotification(notification);
  422. pushDTO.setPushMessage(pushMessage);
  423. Audience audience = new Audience();
  424. audience.addCid(bean.getUser());
  425. pushDTO.setAudience(audience);
  426. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  427. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
  428. rb.setCode(apiResult.getCode());
  429. rb.setMsg(apiResult.getMsg());
  430. rb.setData(apiResult.getData());
  431. return rb;
  432. }
  433. //批量根据cid推送通知
  434. private Result pushNoticeToManyCid(PushReqBean bean) {
  435. Result rb = new Result();
  436. PushDTO pushDTO=new PushDTO();
  437. PushMessage pushMessage = new PushMessage();
  438. GTNotification notification = new GTNotification();
  439. notification.setTitle(bean.getTitle());
  440. notification.setBody(bean.getContent());
  441. notification.setClickType("none");
  442. pushMessage.setNotification(notification);
  443. pushDTO.setPushMessage(pushMessage);
  444. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  445. ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
  446. if (msg.isSuccess()){
  447. AudienceDTO audienceDTO=new AudienceDTO();
  448. audienceDTO.setTaskid(msg.getData().getTaskId());
  449. audienceDTO.setAsync(true);
  450. List<String> users = Arrays.asList(bean.getUser().split(","));
  451. Audience audience=new Audience();
  452. for (String user:users){
  453. audience.addCid(user);
  454. }
  455. audienceDTO.setAudience(audience);
  456. PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
  457. ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
  458. rb.setCode(mapApiResult.getCode());
  459. rb.setMsg(mapApiResult.getMsg());
  460. rb.setData(mapApiResult.getData());
  461. }else {
  462. rb.setCode(msg.getCode());
  463. rb.setMsg(msg.getMsg());
  464. rb.setData(msg.getData());
  465. }
  466. return rb;
  467. }
  468. //根据别名单推通知
  469. private Result pushNoticeToSingleAlias(PushReqBean bean){
  470. Result rb=new Result();
  471. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  472. pushDTO.setRequestId(System.currentTimeMillis() + "");
  473. PushMessage pushMessage = new PushMessage();
  474. GTNotification notification = new GTNotification();
  475. notification.setTitle(bean.getTitle());
  476. notification.setBody(bean.getContent());
  477. notification.setClickType("none");
  478. pushMessage.setNotification(notification);
  479. pushDTO.setPushMessage(pushMessage);
  480. Audience audience = new Audience();
  481. audience.addAlias(bean.getUser());
  482. pushDTO.setAudience(audience);
  483. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  484. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
  485. rb.setCode(apiResult.getCode());
  486. rb.setMsg(apiResult.getMsg());
  487. rb.setData(apiResult.getData());
  488. return rb;
  489. }
  490. //批量根据别名推送通知
  491. private Result pushNoticeToManyAlias(PushReqBean bean) {
  492. Result rb = new Result();
  493. PushDTO pushDTO=new PushDTO();
  494. PushMessage pushMessage = new PushMessage();
  495. GTNotification notification = new GTNotification();
  496. notification.setTitle(bean.getTitle());
  497. notification.setBody(bean.getContent());
  498. notification.setClickType("none");
  499. pushMessage.setNotification(notification);
  500. pushDTO.setPushMessage(pushMessage);
  501. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  502. ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
  503. if (msg.isSuccess()){
  504. AudienceDTO audienceDTO=new AudienceDTO();
  505. audienceDTO.setTaskid(msg.getData().getTaskId());
  506. audienceDTO.setAsync(true);
  507. List<String> users = Arrays.asList(bean.getUser().split(","));
  508. Audience audience=new Audience();
  509. for (String user:users){
  510. audience.addAlias(user);
  511. }
  512. audienceDTO.setAudience(audience);
  513. PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
  514. ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
  515. rb.setCode(mapApiResult.getCode());
  516. rb.setMsg(mapApiResult.getMsg());
  517. rb.setData(mapApiResult.getData());
  518. }else {
  519. rb.setCode(msg.getCode());
  520. rb.setMsg(msg.getMsg());
  521. rb.setData(msg.getData());
  522. }
  523. return rb;
  524. }
  525. //根据标签推送通知
  526. public Result pushNoticeToTag(PushReqBean bean){
  527. Result rb=new Result();
  528. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  529. pushDTO.setRequestId(System.currentTimeMillis() + "");
  530. PushMessage pushMessage = new PushMessage();
  531. GTNotification notification = new GTNotification();
  532. notification.setTitle(bean.getTitle());
  533. notification.setBody(bean.getContent());
  534. notification.setClickType("none");
  535. pushMessage.setNotification(notification);
  536. pushDTO.setPushMessage(pushMessage);
  537. Audience audience = new Audience();
  538. Condition condition=new Condition();
  539. condition.setKey("custom_tag");
  540. List<String> tags=new ArrayList<>();
  541. if (bean.getUser().contains(",")){
  542. tags.addAll(Arrays.asList(bean.getUser().split(",")));
  543. }else {
  544. tags.add(bean.getUser());
  545. }
  546. Set<String> sets=new HashSet<>();
  547. for (String tag:tags){
  548. sets.add(tag);
  549. }
  550. condition.setValues(sets);
  551. condition.setOptType("and");
  552. audience.addCondition(condition);
  553. pushDTO.setAudience(audience);
  554. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  555. ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
  556. rb.setCode(apiResult.getCode());
  557. rb.setMsg(apiResult.getMsg());
  558. rb.setData(apiResult.getData());
  559. return rb;
  560. }
  561. }

其实工具类里的内容大致也能猜出含义,具体可以看个推服务器文档    推送API-个推文档中心

其实也就是构建参数,请求,然后请求个推服务器进行操作而已。

八、打包测试

如果你想在模拟器或者手机上直接运行是没有效果的,因为uniapp运行分为标准基座和自定义基座。

简述就是标准基座就是用于简单的调试的,在原生层不变的情况下,可以动态加载新代码,热重载运行。但如果你修改了原生层,就需要打包了,打成android的apk或者ios的ipa包。这样一来,你连日志什么的都不好监控了,对于调试开发阶段会很麻烦,所以有了自定义基座。

点击运行 ->  运行到手机或模拟器 -> 制作自定义调试基座即可

 

官方说的也很明白,有了自定义基座,这些第三方sdk配置也就生效了,而且只需要打包一次就行,除非你又修改了配置。

制作比较简单,我这里建议使用自有证书,这样没啥限制,生成证书在博客最底下的文章里有,就是那个jks文件,有的人是其他格式的,无所谓,是安卓证书就行。然后选择打自定义调试基座,传统打包,然后确定等待打包就行。

 再点击运行,选择运行自定义基座就可以直接运行在模拟器或者电脑连的真机,进行推送联调看效果了

九、本地打包uniapp 为apk(如果用到,请往下看)

如果使用本地android studio打包apk这种方式,你除了需要上面的操作外,还需要导入jar/aar包。关于如何使用本地打包uniapp这个在之前的博客中已经讲解了,这里就不多说了。

在之前下载的项目工程里的SDK文件夹里有对应的jar/aar包

按需要摘取,不是全放进去哈,我是放了这些

 

 然后在项目的build.gradle下(不是最外面的build.gradle),在android下添加manifestPlaceholders代码如下,总共四个值,你的uniapp 的appid,然后就是unipush的配置,最后是你的android工程的包名,那个applicationId就是包名,你要填的要与applicationId保持一致

 最后最后,记得去开发者中心修改你的包名和签名

填写你android studio里的包名,以及你打包apk证书的sha1值,这个也是之前打包的那个博客里讲解过,这里不赘述了,至此,已经全部结束。

打包博客地址:  Hbuilderx uniapp本地打包android 项目_我靠_叫我大当家的的博客-CSDN博客_hbuilder开发安卓app

额外话

最后还有需要注意的地方是,某米手机会把推送隐藏在不重要的通知里(并非没收到通知消息),想要解决这个问题,需要的到某米开发平台去申请Channel,来调整消息的级别,设为重要级别就可以了。这个有时间我再更新到这里吧。先自己看这个文档吧:文档中心

本人个人原创,如有雷同,纯属巧合,或者与本人联系,做改动。请转载或者CV组合标明出处,谢谢!(如有疑问或错误欢迎指出,本人QQ:752231513)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/274532?site
推荐阅读
相关标签
  

闽ICP备14008679号