个推unipush在线和离线推送 springboot后端代码 uniapp

先说一下来龙去脉,公司要做app推送,是uniapp,我是个新手小白,拿到需求就轻装上阵了,过程很艰难,花了很多时间才做完一个简单的离线和在线推送。
个推的在线和离线推送设置对于新手而言比较模糊,因此经过了大量摸索,才有了下面的代码,期间借鉴了很多同行前辈的代码模式。
整个推送模式分开了在线和离线推送,因为这两者的推送模板是不一样的(很重要),我在一开始的时候以为离线都能推送了,在线应该没问题,但是现实给了我沉重一击,安卓在线是收不到TransmissionTemplate的推送的,最后的选择是,离线用离线模板TransmissionTemplate,在线用通知模板NotificationTemplate。

下面的本次个推应用开发的使用版本,如果maven下载jar包报错,请移步maven配置文件,具体不作赘述,我的上个帖子里也有写。

      <!--UniPush推送sdk--><dependency><groupId>com.gexin.platform</groupId><artifactId>gexin-rp-sdk-http</artifactId><version>4.1.1.4</version></dependency><repositories><repository><id>getui-nexus</id><url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url></repository></repositories>

下面是代码

因为不想包装工具类,而且配置也放到yml中去了,所以写在service层里,这样容易层级调用

/*** @author wzh* @create 2020/11/9 16:17*/
public interface UniPushService {IPushResult singlePush(String phoneNumber, String msg, Integer isAlias);//单个用户推送信息IAliasResult bindAlias(String alias, String clientId);//别名绑定IAliasResult queryClientId(String appId,String alias);//根据别名查询用户cidIQueryResult getClientIdStatus(String appId, String clientId);//通过cid查询用户cid状态String CodeStatus(String alias);//包装的一个判断用户cid状态离线还是在线的方法,并代替了之前用type决定推送模板的方式
}
/*** @author wzh* @create 2020/11/9 16:17*/
@Service
@Slf4j
public class UniPushServiceImpl implements UniPushService {@Value("${gexin.host}") private String host;@Value("${gexin.appId}")private  String appId;@Value("${gexin.appkey}")private  String appKey;@Value("${gexin.appSecret}")private  String appSecret;@Value("${gexin.masterSecret}")private  String masterSecret;@Overridepublic IPushResult singlePush(String phoneNumberOrCid,String msg,Integer isAlias) throws NullPointerException  { //isAlias,1是根据cid推送,2是别名推送,  type的值:1为离线模板透传,2为通知IGtPush push = new IGtPush(host, appKey, masterSecret);SingleMessage message = new SingleMessage();
//        message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");//1:个推通道优先,在线经个推通道下发,离线经厂商下发(默认);但是uniapp,没法这样离线推送
//        离线有效时间,单位为毫秒,可选,但是有时候离线会失效?message.setOffline(true);message.setOfflineExpireTime(72 * 3600 * 1000);boolean result = setMessageData(message, msg, phoneNumberOrCid);if(!result){return null;}// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发message.setPushNetWorkType(0);Target target = new Target();target.setAppId(appId);if(isAlias==1){target.setClientId(phoneNumberOrCid);}else if(isAlias==2){target.setAlias(phoneNumberOrCid);}IPushResult ret = null;try {ret = push.pushMessageToSingle(message, target);} catch (RequestException e) {e.printStackTrace();//推送失败时,重推。ret = push.pushMessageToSingle(message, target, e.getRequestId());}if (ret != null) {System.out.println(ret.getResponse().toString());} else {System.out.println("个推服务器响应异常");}return ret;}//别名绑定@Overridepublic IAliasResult bindAlias(String alias, String clientId) {IGtPush push = new IGtPush(host, appKey, masterSecret);IAliasResult iAliasResult = push.bindAlias(appId, alias, clientId);
//        System.out.println("绑定结果:" + iAliasResult.getResponse());return iAliasResult;}//根据别名查询cid@Overridepublic IAliasResult queryClientId(String appId, String alias) {IGtPush push = new IGtPush(host, appKey, masterSecret);return push.queryClientId(appId, alias);}//根据cid查询用户状态@Overridepublic IQueryResult getClientIdStatus(String appId, String cid) {IGtPush push = new IGtPush(host, appKey, masterSecret);return  push.getClientIdStatus(appId, cid);}//包装的一个判断用户cid状态离线还是在线的方法,代替了之前用type决定推送模板的方式@Overridepublic String CodeStatus(String alias){IAliasResult iAliasResult = queryClientId(appId, alias);
//        System.out.println(iAliasResult.getResponse());if(!iAliasResult.getResponse().get("result").equals("ok")){return "null";}List<String> clientIdList = iAliasResult.getClientIdList();if (clientIdList.size()==0){return "null";}String cid = clientIdList.get(0);IQueryResult clientIdStatus = getClientIdStatus(appId, cid);Object result = clientIdStatus.getResponse().get("result");return result.toString();}//设置消息数据private boolean setMessageData(Message message, String msg,String phoneNumberOrCid) {String result = CodeStatus(phoneNumberOrCid);if(result.equals("Offline")){TransmissionTemplate template = getTransmissionTemplate(msg);//离线模板1message.setData(template);return true;}if(result.equals("Online")){NotificationTemplate template =  notificationTemplateDemo(msg);   //通知模板 ,再多来两个模板我就要整switch了message.setData(template);return true;}else return false;}//通知模板设置private NotificationTemplate notificationTemplateDemo(String msg/*, String phoneNumOrCid,String orderNum*/) {NotificationTemplate template = new NotificationTemplate();template.setAppId(appId);template.setAppkey(appKey);// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动template.setTransmissionType(1);//透传内容,不在通知栏中展示,自定义内容,开发者自行处理,不支持转义字符template.setTransmissionContent(msg);Style0 style = new Style0();// 设置通知栏标题与内容style.setTitle("xxxx");style.setText(msg);// 配置通知栏图标style.setLogo("icon.png");// 配置通知栏网络图标
//        style.setLogoUrl(pushMessage.getIconUrl());// 设置通知是否响铃,震动,或者可清除style.setRing(true);style.setVibrate(true);style.setClearable(true);style.setChannel("默认channel");style.setChannelName("默认channel名称");style.setChannelLevel(3);//3:有声音,有震动,锁屏和通知栏中都显示,通知唤醒屏幕。(推荐)template.setStyle(style);// 设置定时展示时间,安卓机型可用// template.setDuration("2019-08-16 11:40:00", "2019-08-16 12:24:00");// 消息覆盖//template.setNotifyid(pushMessage.getMsgId()); // 在消息推送的时候设置自定义的notifyid。如果需要覆盖此条消息,则下次使用相同的notifyid发一条新的消息。客户端sdk会根据notifyid进行覆盖。return template;}//离线通知模板1 -- ios和安卓一起推送,自动识别手机厂商,如果不是苹果会忽视APN。private TransmissionTemplate getTransmissionTemplate(String msg) {TransmissionTemplate template = new TransmissionTemplate();template.setAppId(appId);template.setAppkey(appKey);template.setTransmissionType(1);//搭配transmissionContent使用,可选值为1、2;1:立即启动APP(不推荐使用,影响客户体验)2:客户端收到消息后需要自行处理template.setTransmissionContent(msg); //透传内容template.setAPNInfo(getAPNPayload(msg)); //ios消息推送,用于设置标题、内容、语音、多媒体、VoIP(基于IP的语音传输)等。离线走APNs时起效果Notify notify = new Notify();notify.setTitle("推送标题");notify.setContent(msg);notify.setIntent("intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=xxxxxx/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=xxxx;S.content=xxxxx;S.payload="+msg+";end");//上面的参数可以去看官方的API文档,里面有写离线厂商推送配置的具体。notify.setType(GtReq.NotifyInfo.Type._intent);template.set3rdNotifyInfo(notify);//设置第三方通知return template;}//ios离线推送APN设置private  APNPayload getAPNPayload(String msg) {APNPayload payload = new APNPayload();//在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字payload.setAutoBadge("+1");payload.setContentAvailable(0);//0是有通知栏消息,1是无通知栏消息//ios 12.0 以上可以使用 Dictionary 类型的 soundpayload.setSound("default");payload.setCategory("$由客户端定义");//在客户端通知栏触发特定的action和button显示payload.addCustomMsg("msg",msg);//增加自定义的数据,Key-Value形式
//        是否用字典模式?payload.setAlertMsg(getDictionaryAlertMsg(msg));return payload;}//获取字典模式对象。private APNPayload.DictionaryAlertMsg getDictionaryAlertMsg(String msg) {APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();alertMsg.setBody(msg);alertMsg.setTitle("订单到期提醒");return alertMsg;}}

测试实例:

提示 :由于这里的实例是在一个定时任务中,所以没有别的代码,只是注入了UniPushService,然后调用singlePush方法就行。

uniPushService.singlePush("177xxxxxx224", "咕咕咕", 2);

个推unipush在线和离线推送 springboot后端代码 uniapp相关推荐

  1. 基于微信小程序在线论坛bbs交流系统设计springboot后端

    程序开发软件:Idea + 微信开发者工具 + mysql 开发技术:Springboot后端,小程序客户端,bootstrap后端界面 为了方便朋友们在手机端微信交流问题,开发了这个小程序论坛app ...

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

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

  3. uniapp unipush接入个推消息推送(各种踩坑记录)安卓+IOS+在线消息+离线消息

    uniapp 消息推送功能实现 上周公司要求做一个消息推送的功能,由于现有的电商APP是用uniapp做的,所以优先考虑uniapp自带的unipush消息推送. ios证书导出踩坑 ios推送证书导 ...

  4. Uniapp的消息推送Unipush(在线、离线、服务端)

    基本配置 Hbuild下打开PUSH,Unipush功能,并详细阅读"使用指南".         打包配置安卓包名,例如pts.sh 打包选择自有证书 自有证书生成:D:\Jav ...

  5. unipush实现推送,包括在线和离线详细步骤

    四级标题 unipush实现推送,东方包括在线和离线详细步骤 第一步,先 开通UniPush推送服务 , 具体怎么开通设置,参考下面网址! https://ask.dcloud.net.cn/arti ...

  6. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  7. 关于百度云推送加厂商进行app离线推送的步骤小记

    经过漫长的无所事事,终于来了一个活,要搞推送,不能socket,要后台关闭了也能推. 第三方推送,厂商自带,各种看了一下,但最终产品敲定,用百度云推送 研究的过程都是千篇一律,下demo,看文档,测试 ...

  8. uniapp push 推送 个推 安卓Android添加Google 推送服务 FCM 离线推送 Dcloud

    项目甲方在国外需要用到google推送服务,看了文档中说明,如果安卓要实现离线推送,需要通过厂商来解决 在google开发者后台添加项目,获取Legancy server key 获取google-s ...

  9. Android 通过Service单独进程模仿离线推送 Server Push

    2019独角兽企业重金招聘Python工程师标准>>> 概述: 首先简单阐述一下我对于消息推送的理解,这里拿QQ来举例吧,当我们手机端的QQ离线了,并且退出了QQ应用,但是这时候如果 ...

最新文章

  1. 文件上传流式处理commons-fileupload
  2. 扩展 CommandField 类别 - Header 加入新增钮
  3. c语言中0xof423什么意思,C语言指针 百思不得其解的一个问题
  4. 计算机辅助外文文献,计算机辅助设计建筑CAD论文中英文对照资料外文翻译文献.doc...
  5. python内置对象是什么_Python的内置对象类型——元组、文件,python
  6. tsm如何备份oracle原理,技巧 | 使用TSM备份Oracle,怎么设置通道更好?
  7. 大数据_Flink_数据处理_yarn和k8s平台的flink部署---Flink工作笔记0015
  8. 西门子触摸屏程序锁屏V1.0
  9. 最优化方法 19:近似梯度下降
  10. chromebook 笔记本 TrueNas 设置 wifi 连网
  11. Periodic Strings (求HoHoHo字符串最小周期)
  12. linux环境hexo和GithubPages搭建个人博客
  13. Markdown——图片、文字显示居中的一种方法
  14. halcon机器视觉实例1--表面划痕检测
  15. flask项目之5:短信验证码发送
  16. 学习笔记_OSI模型
  17. 网站被挂马怎么解决_网站被黑解决办法
  18. 视频教程-C#Winform组件应用-C#
  19. Privacy Statement
  20. 【国庆篇】用html5简单制作一个国旗

热门文章

  1. 第一次扁平化博客实战练习
  2. ZZNUOJ_C语言1075:聚餐人数统计(完整代码)
  3. ZYNQ裸板:BRAM篇
  4. Xilinx BRAM IP介绍
  5. Laravel5使用qq邮箱smtp发邮件配置及测试
  6. 基于java的ssm和微信小程序实现物业缴费系统的设计与实现【附项目源码+论文说明】
  7. 从Apollo看长轮询
  8. nodeJS如何快速升级降级?
  9. 【linux】在线linux编译器
  10. 数据库开发-5-数据表的物理实现