当前位置:   article > 正文

Springboot集成uniPush,包含华为荣耀厂商推送(完整版)_com.getui.push

com.getui.push

本代码适用于unipush1.0版本的个推使用

先在项目pom中导入个推依赖

  1. <!-- APP个推 -->
  2. <dependency>
  3. <groupId>com.getui.push</groupId>
  4. <artifactId>restful-sdk</artifactId>
  5. <version>1.0.0.4</version>
  6. </dependency>

推送配置类:推送配置从配置文件中读取

  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. /**
  7. * 个推推送类
  8. */
  9. @Configuration
  10. public class GTPushConfig {
  11. @Value("${push.app_id}")
  12. private String appId;
  13. @Value("${push.app_key}")
  14. private String appKey;
  15. @Value("${push.master_secret}")
  16. private String masterSecret;
  17. @Bean(name = "myApiHelper")
  18. public ApiHelper apiHelper() {
  19. // 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
  20. System.setProperty("http.maxConnections", "200");
  21. GtApiConfiguration apiConfiguration = new GtApiConfiguration();
  22. // 填写应用配置
  23. apiConfiguration.setAppId(appId);
  24. apiConfiguration.setAppKey(appKey);
  25. apiConfiguration.setMasterSecret(masterSecret);
  26. // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
  27. // 默认为https://restapi.getui.com/v2
  28. apiConfiguration.setDomain("https://restapi.getui.com/v2/");
  29. // 实例化ApiHelper对象,用于创建接口对象
  30. ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
  31. return apiHelper;
  32. }
  33. }

推送集成工具类:注意厂商推送的Intent配置里的component=com.xx.xx改成自己的安卓打包包名,

该推送包含了华为、荣耀厂商推送角标,已经测试过正常显示角标

  1. import com.getui.push.v2.sdk.ApiHelper;
  2. import com.getui.push.v2.sdk.api.PushApi;
  3. import com.getui.push.v2.sdk.common.ApiResult;
  4. import com.getui.push.v2.sdk.dto.CommonEnum;
  5. import com.getui.push.v2.sdk.dto.req.Audience;
  6. import com.getui.push.v2.sdk.dto.req.AudienceDTO;
  7. import com.getui.push.v2.sdk.dto.req.Settings;
  8. import com.getui.push.v2.sdk.dto.req.Strategy;
  9. import com.getui.push.v2.sdk.dto.req.message.PushChannel;
  10. import com.getui.push.v2.sdk.dto.req.message.PushDTO;
  11. import com.getui.push.v2.sdk.dto.req.message.PushMessage;
  12. import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
  13. import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
  14. import com.getui.push.v2.sdk.dto.req.message.android.Ups;
  15. import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
  16. import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
  17. import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
  18. import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
  19. import com.opencloud.common.utils.JSONUtils;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.stereotype.Component;
  22. import javax.annotation.Resource;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. @Slf4j
  27. @Component
  28. public class UniPushUtils {
  29. // 消息推送
  30. public static final String MESSAGE_PUSH = "1";
  31. // 离线推送
  32. public static final String OFFLINE_PUSH = "2";
  33. @Resource(name = "myApiHelper")
  34. private ApiHelper myApiHelper;
  35. /**
  36. * 消息推送(离线推送)单cid推送
  37. */
  38. public ApiResult<Map<String, Map<String, String>>> pushToSingleByCid(String cid, String title, String content, String linkUrl, String type) {
  39. PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
  40. // 设置接收人信息
  41. Audience audience = new Audience();
  42. pushDTO.setAudience(audience);
  43. audience.addCid(cid); // cid
  44. // 进行cid单推
  45. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  46. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
  47. if (apiResult.isSuccess()) {
  48. // success
  49. log.info("推送成功");
  50. System.out.println(apiResult.getData());
  51. } else {
  52. // failed
  53. log.error("推送失败");
  54. System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
  55. }
  56. return apiResult;
  57. }
  58. /**
  59. * 消息推送(离线推送)别名推送
  60. */
  61. public ApiResult<Map<String, Map<String, String>>> pushToSingleByAlias(String alias, String title, String content, String linkUrl, String type) {
  62. PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
  63. // 设置接收人信息
  64. Audience audience = new Audience();
  65. pushDTO.setAudience(audience);
  66. audience.addAlias(alias); // cid
  67. // 进行cid单推
  68. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  69. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
  70. if (apiResult.isSuccess()) {
  71. // success
  72. log.info("推送成功");
  73. System.out.println(apiResult.getData());
  74. } else {
  75. // failed
  76. log.error("推送失败");
  77. System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
  78. }
  79. return apiResult;
  80. }
  81. /**
  82. * cid批量推
  83. * @param cidList
  84. * @param title
  85. * @param content
  86. */
  87. public ApiResult<Map<String, Map<String, String>>> pushListByCid(List<String> cidList, String title, String content, String linkUrl, String type) {
  88. //批量发送
  89. AudienceDTO audienceDTO = new AudienceDTO();
  90. PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);
  91. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  92. ApiResult<TaskIdDTO> createApiResult = pushApi.createMsg(pushDTO);
  93. if (! createApiResult.isSuccess()) {
  94. log.error("推送:创建消息失败"+createApiResult.getMsg());
  95. }
  96. // 设置接收人信息
  97. Audience audience = new Audience();
  98. pushDTO.setAudience(audience);
  99. audience.setCid(cidList);
  100. audienceDTO.setAudience(audience);
  101. audienceDTO.setTaskid(createApiResult.getData().getTaskId());
  102. audienceDTO.setAsync(true);
  103. ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushListByCid(audienceDTO);
  104. if (apiResult.isSuccess()) {
  105. // success
  106. log.info("推送成功");
  107. } else {
  108. // failed
  109. log.error("推送失败");
  110. System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
  111. }
  112. return apiResult;
  113. }
  114. /**
  115. * 推送所有用户
  116. *
  117. * @param title
  118. * @param content
  119. * @param linkUrl
  120. * @return
  121. */
  122. public ApiResult<TaskIdDTO> pushAll(String title, String content, String linkUrl, String type) {
  123. PushDTO<String> pushDTO = this.pushDTOAll(title, content, linkUrl, type);
  124. // 进行cid单推
  125. PushApi pushApi = myApiHelper.creatApi(PushApi.class);
  126. ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
  127. if (apiResult.isSuccess()) {
  128. // success
  129. log.info("推送成功");
  130. System.out.println(apiResult.getData());
  131. } else {
  132. // failed
  133. log.error("推送失败");
  134. System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
  135. }
  136. return apiResult;
  137. }
  138. /**
  139. * 推送全部组装消息实体
  140. *
  141. * @param title
  142. * @param content
  143. * @param linkUrl
  144. * @return
  145. */
  146. private PushDTO<String> pushDTOAll(String title, String content, String linkUrl, String type) {
  147. Map<String, String> map = new HashMap<>();
  148. map.put("title", title);
  149. map.put("content", content);
  150. map.put("linkUrl", linkUrl);
  151. map.put("type", type);
  152. // 转json对象
  153. String payload = JSONUtils.toJSONString(map);
  154. PushDTO<String> pushDTO = new PushDTO<String>();
  155. pushDTO.setRequestId(System.currentTimeMillis() + "");
  156. pushDTO.setGroupName("g-name1");
  157. Settings settings = new Settings();
  158. settings.setTtl(3600000);
  159. Strategy strategy = new Strategy();
  160. strategy.setSt(1);
  161. settings.setStrategy(strategy);
  162. pushDTO.setSettings(settings);
  163. //TODO 安卓IOS应用在线走个推通道
  164. PushMessage pushMessage = new PushMessage();
  165. Map<String, Object> mapTC = new HashMap<>();
  166. mapTC.put("title", title);
  167. mapTC.put("content", content);
  168. mapTC.put("linkUrl", linkUrl);
  169. mapTC.put("type", type);
  170. mapTC.put("payload", payload);
  171. String jsonTC = JSONUtils.toJSONString(mapTC);
  172. pushMessage.setTransmission(jsonTC);
  173. pushDTO.setPushMessage(pushMessage);
  174. //安卓应用离线走厂商
  175. PushChannel pushChannel = new PushChannel();
  176. AndroidDTO androidDTO = new AndroidDTO();
  177. Ups ups = new Ups();
  178. ThirdNotification thirdNotification = new ThirdNotification();
  179. thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_INTENT.type);
  180. thirdNotification.setTitle(title);
  181. thirdNotification.setBody(content);
  182. thirdNotification.setIntent("intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;" +
  183. "component=com.xx.xx/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +
  184. "S.title="+title+";" +
  185. "S.content="+content+";" +
  186. "S.payload="+payload+";end");
  187. ups.setNotification(thirdNotification);
  188. //设置options 方式二
  189. Map<String, Map<String, Object>> options = new HashMap<String, Map<String, Object>>();
  190. Map<String, Object> all = new HashMap<String, Object>();
  191. all.put("channel", "default");
  192. all.put("badgeAddNum", 1);
  193. all.put("badgeClass", "com.getui.demo.GetuiSdkDemoActivity");
  194. options.put("ALL", all);
  195. Map<String, Object> hw = new HashMap<String, Object>();
  196. options.put("HW", hw);
  197. hw.put("/message/android/notification/badge/class", "io.dcloud.PandoraEntry");
  198. hw.put("/message/android/notification/badge/add_num",1);
  199. Map<String, Object> ho = new HashMap<String, Object>();
  200. options.put("HO", ho);
  201. ho.put("/message/android/notification/badge/badgeClass", "io.dcloud.PandoraEntry");
  202. ho.put("/message/android/notification/badge/addNum",1);
  203. ups.setOptions(options);
  204. androidDTO.setUps(ups);
  205. pushChannel.setAndroid(androidDTO);
  206. IosDTO iosDTO = new IosDTO();
  207. Aps aps = new Aps();
  208. Alert alert = new Alert();
  209. alert.setTitle(title);
  210. alert.setBody(content);
  211. aps.setContentAvailable(0);
  212. aps.setSound("default");
  213. aps.setAlert(alert);
  214. iosDTO.setPayload(payload);
  215. iosDTO.setAps(aps);
  216. iosDTO.setType("notify");
  217. iosDTO.setAutoBadge("+1");//苹果角标
  218. pushChannel.setIos(iosDTO);
  219. pushDTO.setPushChannel(pushChannel);
  220. return pushDTO;
  221. }
  222. /**
  223. * 消息参数模板
  224. */
  225. private PushDTO<Audience> buildPushDTO(String title, String content, String linkUrl, String type) {
  226. Map<String, String> map = new HashMap<>();
  227. map.put("title", title);
  228. map.put("content", content);
  229. map.put("linkUrl", linkUrl);
  230. map.put("type", type);
  231. // 转json对象
  232. String payload = JSONUtils.toJSONString(map);
  233. PushDTO<Audience> pushDTO = new PushDTO<Audience>();
  234. pushDTO.setRequestId(System.currentTimeMillis() + "");
  235. pushDTO.setGroupName("g-name1");
  236. Settings settings = new Settings();
  237. settings.setTtl(3600000);
  238. Strategy strategy = new Strategy();
  239. strategy.setSt(1);
  240. settings.setStrategy(strategy);
  241. pushDTO.setSettings(settings);
  242. //TODO 安卓IOS应用在线走个推通道
  243. PushMessage pushMessage = new PushMessage();
  244. Map<String, Object> mapTC = new HashMap<>();
  245. mapTC.put("title", title);
  246. mapTC.put("content", content);
  247. mapTC.put("linkUrl", linkUrl);
  248. mapTC.put("type", type);
  249. mapTC.put("payload", payload);
  250. String jsonTC = JSONUtils.toJSONString(mapTC);
  251. pushMessage.setTransmission(jsonTC);
  252. pushDTO.setPushMessage(pushMessage);
  253. //TODO 安卓应用离线走厂商
  254. PushChannel pushChannel = new PushChannel();
  255. AndroidDTO androidDTO = new AndroidDTO();
  256. Ups ups = new Ups();
  257. ThirdNotification thirdNotification = new ThirdNotification();
  258. thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_INTENT.type);
  259. thirdNotification.setTitle(title);
  260. thirdNotification.setBody(content);
  261. thirdNotification.setIntent("intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;" +
  262. "component=com.xx.xx/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +
  263. "S.title="+title+";" +
  264. "S.content="+content+";" +
  265. "S.payload="+payload+";end");
  266. ups.setNotification(thirdNotification);
  267. //设置options 方式二
  268. Map<String, Map<String, Object>> options = new HashMap<String, Map<String, Object>>();
  269. Map<String, Object> all = new HashMap<String, Object>();
  270. all.put("channel", "default");
  271. all.put("badgeAddNum", 1);
  272. all.put("badgeClass", "com.getui.demo.GetuiSdkDemoActivity");
  273. options.put("ALL", all);
  274. Map<String, Object> hw = new HashMap<String, Object>();
  275. options.put("HW", hw);
  276. hw.put("/message/android/notification/badge/class", "io.dcloud.PandoraEntry");
  277. hw.put("/message/android/notification/badge/add_num",1);
  278. Map<String, Object> ho = new HashMap<String, Object>();
  279. options.put("HO", ho);
  280. ho.put("/message/android/notification/badge/badgeClass", "io.dcloud.PandoraEntry");
  281. ho.put("/message/android/notification/badge/addNum",1);
  282. ups.setOptions(options);
  283. androidDTO.setUps(ups);
  284. pushChannel.setAndroid(androidDTO);
  285. //TODO ios离线推送
  286. IosDTO iosDTO = new IosDTO();
  287. Aps aps = new Aps();
  288. Alert alert = new Alert();
  289. alert.setTitle(title);
  290. alert.setBody(content);
  291. aps.setContentAvailable(0);
  292. aps.setSound("default");
  293. aps.setAlert(alert);
  294. iosDTO.setPayload(payload);
  295. iosDTO.setAps(aps);
  296. iosDTO.setType("notify");
  297. iosDTO.setAutoBadge("+1");
  298. pushChannel.setIos(iosDTO);
  299. pushDTO.setPushChannel(pushChannel);
  300. return pushDTO;
  301. }
  302. /**
  303. * 离线通知消息参数模板
  304. */
  305. private PushDTO<Audience> offlinePushDTO(String title, String content, String linkUrl, String type) {
  306. PushDTO<Audience> pushDTO = new PushDTO<>();
  307. // 设置推送参数
  308. //requestid需要每次变化唯一
  309. pushDTO.setRequestId(System.currentTimeMillis() + "");
  310. pushDTO.setGroupName("wxb-group");
  311. // PushMessage在线走个推通道才会起作用的消息体
  312. Map<String, String> map = new HashMap<>();
  313. map.put("title", title);
  314. map.put("content", content);
  315. map.put("linkUrl", linkUrl);
  316. map.put("type", type);
  317. PushMessage pushMessage = new PushMessage();
  318. pushDTO.setPushMessage(pushMessage);
  319. Map<String, Object> mapTC = new HashMap<>();
  320. mapTC.put("title", title);
  321. mapTC.put("content", content);
  322. mapTC.put("payload", map);
  323. String jsonTC = JSONUtils.toJSONString(mapTC);
  324. System.err.println(jsonTC);
  325. pushMessage.setTransmission(jsonTC);
  326. log.info("pushDTO:{}", pushDTO);
  327. return pushDTO;
  328. }
  329. }

单元测试参考:

  1. //String alias = "29f27029ec9245a49335c02bff224952";//ios
  2. String cid = "ba0c214fdf43f434gfg44545dghg4ttt";//iosk
  3. String title = "“金点子”征集活动上线啦!";
  4. String content = "2023年公司工作会暨职工代表大会金点子征集活动上线!点击参与“金点子”征集活动,赢精美礼品!";
  5. String linkUrl = "/pages/viewactivityweb/viewactivityweb?";
  6. String type = "click";
  7. //ApiResult<Map<String, Map<String, String>>> map = uniPushUtils.pushToSingleByAlias(cid,title,content,linkUrl,type);
  8. ApiResult<TaskIdDTO> map = uniPushUtils.pushAll(title,content,linkUrl,type);

 

APP端代码仅供参考:

App.vue中处理消息监听:

  1. //消息推送监听处理
  2. //#ifdef APP-PLUS
  3. plus.push.addEventListener("click", function(msg) {
  4. var payload = {};
  5. var platform = uni.getSystemInfoSync().platform;
  6. if (platform == "ios") {
  7. if (msg['type'] == "click") {
  8. //通过苹果服务器通知过来的消息
  9. payload = msg['payload'];
  10. } else {
  11. //通过个推透传,创建本地通知的消息
  12. payload = JSON.parse(JSON.parse(msg.payload));
  13. }
  14. } else if (platform == 'android') {
  15. payload = msg.payload;
  16. }
  17. //跳转对应页面
  18. setTimeout(function() {
  19. if (payload.linkUrl) {
  20. uni.navigateTo({
  21. url: payload.linkUrl,
  22. })
  23. }
  24. }, 1000)
  25. }, false);
  26. //在线消息推送监听处理
  27. plus.push.addEventListener("receive", function(msg) {
  28. console.log("receive:" + msg)
  29. var platform = uni.getSystemInfoSync().platform;
  30. let payload = msg.payload
  31. if (platform == "ios") {
  32. if (msg.type == "receive") // 这里判断触发的来源,否则一直推送。
  33. {
  34. //ios平台应用在前台时,不能收到通知消息,只能走透传,在创建一条本地消息 plus.push.createMessage(msg.content, JSON.stringify(msg.payload), { title: msg.title });
  35. var options = {
  36. cover: false,
  37. title: msg.title
  38. };
  39. //创建一条推送消息
  40. plus.push.createMessage(msg.content, JSON.stringify(msg.payload), options);
  41. //添加在线消息提示点
  42. getApp().globalData.badgeNumber = getApp().globalData.badgeNumber+1;
  43. plus.runtime.setBadgeNumber(getApp().globalData.badgeNumber);
  44. }
  45. } else if (platform == 'android') {
  46. var options = {
  47. cover: false,
  48. title: msg.title
  49. };
  50. //创建一条推送消息
  51. plus.push.createMessage(msg.content, JSON.stringify(msg.payload), options);
  52. //添加在线消息提示点
  53. getApp().globalData.badgeNumber = getApp().globalData.badgeNumber+1;
  54. plus.runtime.setBadgeNumber(getApp().globalData.badgeNumber);
  55. }
  56. }, false);
  57. // #endif

App端绑定别名以及处理清除消息提示点:

新建getui.js

  1. function igexinTool() {
  2. var isAndorid, PushManager, context, Instance, GeTuiSdk, UIApplication, oldNum;
  3. //#ifdef APP-PLUS
  4. if (plus.os.name == 'Android') {
  5. isAndorid = true;
  6. } else {
  7. isAndorid = false;
  8. }
  9. if (isAndorid) {
  10. PushManager = plus.android.importClass("com.igexin.sdk.PushManager");
  11. context = plus.android.runtimeMainActivity().getContext();
  12. Instance = PushManager.getInstance();
  13. } else {
  14. GeTuiSdk = plus.ios.importClass("GeTuiSdk");
  15. }
  16. // #endif
  17. this.bindAlias = function(alias) {
  18. if (isAndorid) {
  19. Instance.bindAlias(context, alias);
  20. } else {
  21. GeTuiSdk.bindAliasandSequenceNum(alias, alias);
  22. }
  23. }
  24. this.unbindAlias = function(alias) {
  25. if (isAndorid) {
  26. Instance.unBindAlias(context, alias, true);
  27. } else {
  28. GeTuiSdk.unbindAliasandSequenceNumandIsSelf(alias, alias, true);
  29. }
  30. }
  31. this.getVersion = function() {
  32. if (isAndorid) {
  33. return Instance.getVersion(context);
  34. } else {
  35. return GeTuiSdk.version;
  36. }
  37. }
  38. //开启推送
  39. this.turnOnPush = function() {
  40. if (isAndorid) {
  41. Instance.turnOnPush(context);
  42. } else {
  43. GeTuiSdk.setPushModeForOff(false);
  44. }
  45. }
  46. //关闭推送
  47. this.turnOffPush = function() {
  48. if (isAndorid) {
  49. Instance.turnOffPush(context);
  50. } else {
  51. GeTuiSdk.setPushModeForOff(true);
  52. }
  53. }
  54. //清除消息角标
  55. this.clearnBadge = function() {
  56. getApp().globalData.badgeNumber = 0;
  57. //清除角标
  58. if (isAndorid) {
  59. //设置应用图标的数量
  60. plus.runtime.setBadgeNumber(0);
  61. plus.runtime.setBadgeNumber(-1);
  62. } else {
  63. //设置应用图标的数量
  64. plus.runtime.setBadgeNumber(0);
  65. GeTuiSdk.setBadge(0);
  66. }
  67. }
  68. }
  69. export default igexinTool

清除消息角标:

App.vue引入js

import igexinTool from '@/config/getui.js'
  1. onShow: function() {
  2. //清除消息角标
  3. var tool = new igexinTool();
  4. tool.clearnBadge();
  5. },

绑定推送别名:

在需要绑定别名的业务逻辑页面引入js

import igexinTool from '@/config/getui.js'
  1. var tool = new igexinTool();
  2. tool.bindAlias('需要绑定的别名 如:用户ID');

 

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

闽ICP备14008679号