随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

一、简介

个推是商用级的移动应用消息推送云服务解决方案,客户端SDK支持Android和iOS两大平台,云端支持丰富的网页端推送管理功能和多种语言版本的API开放接口。

第三方应用开发者可以借助该服务,快速构建稳定高效的消息推送系统,为实时业务需求和产 品运营提供技术支持。个推提供了丰富的消息推送形式,App可以使用常规的通知消息满足日常的运营需求,也可以借助透传消息实现App业务相关的特定功 能。为了方便第三方应用使用推送服务API,个推提供针对单个用户推送、针对一组用户批量推送、以及根据特定省市、特定用户标签进行精准推送等多种推送方 式。

个推提供各类主流移动应用开发工具的支持,以便各种背景的技术人员能够在3分钟内快速完成SDK的集成测试,立即享用推送带来的乐趣。

二、流程

1.第三方应用集成个推SDK,个推SDK运行后获取CID返回给第三方应用,由第三方应用保存至其应用服务器;

2.第三方应用服务器调用推送API进行消息推送,个推SDK将接收到的推送消息回调给App进行处理。

三、推送方式

个推提供JAVA、C#、PHP、Python等多种语言版本的服务端API SDK,可以和各种第三方应用服务器技术架构进行对接。为了最大程度提高消息推送性能,第三方开发者需要根据业务需求合理选择消息推送形式。如果是针对每 个用户进行定制化的消息推送、或是实现类似IM的点对点消息,请采用单推消息形式(SingleMessage);如果需要根据特定条件筛选出一批CID 后推送相同的内容,请选择批量推送形式(ListMessage);如果希望针对省市或全量用户进行推送,请选择群推形式(AppMessage)。

通过上面描述已经大概了解个推了,可以单推、批量推、按照筛选条件批量推送,详细更多介绍请参考官方文档:首页-个推文档中心

接下来直接上封装好的服务端主要API

四、示例

全局参数,实际中替换为自己的

 public static final String AppID = "";public static final String AppSecret = "";public static final String AppKey = "";public static final String MasterSecret = "";public static final String HOST = "http://sdk.open.api.igexin.com/apiex.htm";

第一个推送方式,也是最常用性能最高的推送,单推:

 /*** * @param cidOrAlias*            别名或者cid* @param msg*            透传消息内容* @param type*            1-cid推,2-别名推*/public static void pushToSingle(String cidOrAlias, String msg, int type) {IGtPush push = new IGtPush(HOST, AppKey, MasterSecret);ITemplate template = buildTransmissionTemplate(msg);SingleMessage message = new SingleMessage();// 是否离线推送message.setOffline(true);// 离线有效时间,单位为毫秒,可选message.setOfflineExpireTime(24 * 3600 * 1000);// 消息内容message.setData(template);// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发message.setPushNetWorkType(0);Target target = new Target();target.setAppId(AppID);if (type == 1) {target.setClientId(cidOrAlias);} else if (type == 2) {// 按别名推送target.setAlias(cidOrAlias);}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("服务器响应异常");}}

上面有详细的注释,有几个需要注意几个地方。

推送的消息类型,支持各种模板,有通知栏透传模板,通知栏点击跳转网页模板,透传模板等,下面列举示例

1、通知栏点击跳转网页模板:

public static LinkTemplate buildLinkTemplate() {LinkTemplate template = new LinkTemplate();// 设置APPID与APPKEYtemplate.setAppId(AppID);template.setAppkey(AppKey);Style0 style = new Style0();// 设置通知栏标题与内容style.setTitle("请输入通知栏标题");style.setText("请输入通知栏内容");// 配置通知栏图标style.setLogo("icon.png");// 配置通知栏网络图标style.setLogoUrl("");// 设置通知是否响铃,震动,或者可清除style.setRing(true);style.setVibrate(true);style.setClearable(true);template.setStyle(style);// 设置打开的网址地址template.setUrl("http://www.baidu.com");return template;}

通过这种方式推送,手机上会收到一条通知栏消息,点击后会打开指定网页。

2、通知栏透传模板

 public static NotificationTemplate buildNotificationTemplate() {NotificationTemplate template = new NotificationTemplate();// 设置APPID与APPKEYtemplate.setAppId(AppID);template.setAppkey(AppKey);Style0 style = new Style0();// 设置通知栏标题与内容style.setTitle("群推通知栏标题");style.setText("群推通知栏内容");// 配置通知栏图标style.setLogo("icon.png");// 配置通知栏网络图标style.setLogoUrl("");// 设置通知是否响铃,震动,或者可清除style.setRing(true);style.setVibrate(true);style.setClearable(true);template.setStyle(style);// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动template.setTransmissionType(2);template.setTransmissionContent("请输入您要透传的内容");return template;}

通过这种方式,手机上会收到一条通知栏消息,并且带有透传消息。

3、纯透传模板:

 public static ITemplate buildTransmissionTemplate(String msg) {TransmissionTemplate template = new TransmissionTemplate();template.setAppId(AppID);template.setAppkey(AppKey);template.setTransmissionContent(msg);template.setTransmissionType(1); // 这个Type为int型,填写1则自动启动appreturn template;}

客户端集成SDK设置监听后,会收到透传消息,客户端可以自己灵活的选择处理方式。

上面还提到按别名推送,那么别名是怎么来的呢

 public static void bindAlias(String cid, String alias) {IGtPush push = new IGtPush(HOST, AppKey, MasterSecret);IAliasResult bindSCid = push.bindAlias(AppID, alias, cid);System.out.println("绑定结果:" + bindSCid.getResult() + "错误码:" + bindSCid.getErrorMsg());}

这是绑定别名的方法,这样通过绑定别名可以和自己的业务数据绑定进行推送。单推就介绍到这里。

第二种推送方式:批量推送:

public static void pushToList(List<String> cids, String msg) {// 配置返回每个用户返回用户状态,可选System.setProperty("gexin_pushList_needDetails", "true");// 配置返回每个别名及其对应cid的用户状态,可选// System.setProperty("gexin_pushList_needAliasDetails", "true");IGtPush push = new IGtPush(HOST, AppKey, MasterSecret);// 透传模板ITemplate template = buildTransmissionTemplate(msg);ListMessage message = new ListMessage();message.setData(template);// 设置消息离线,并设置离线时间message.setOffline(true);// 离线有效时间,单位为毫秒,可选message.setOfflineExpireTime(24 * 1000 * 3600);// 配置推送目标List<Target> targets = new ArrayList<Target>();Target target = null;for (String cid : cids) {target = new Target();target.setAppId(AppID);target.setClientId(cid);targets.add(target);// target.setAlias(Alias1);}// taskId用于在推送时去查找对应的messageString taskId = push.getContentId(message, "任务别名_toApp");// String taskId = push.getContentId(message);IPushResult ret = push.pushMessageToList(taskId, targets);System.out.println(ret.getResponse().toString());}

这里实际上就是,对一批指定cliendid的用户进行推送,也支持上面的几种模板,参数也可以传别名集合进来。

第三种推送方式,按各种筛选条件进行群推:

 public static void pushToApp(String msg, List<String> tagList) throws Exception {IGtPush push = new IGtPush(HOST, AppKey, AppSecret);// 使用通知栏链接模板ITemplate template = buildLinkTemplate();AppMessage message = new AppMessage();message.setData(template);message.setOffline(true);// 离线有效时间,单位为毫秒,可选message.setOfflineExpireTime(24 * 1000 * 3600);// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发message.setPushNetWorkType(0);// 全量推送个推控制下发速度在100条/秒,只有toApp支持定速推送。// message.setSpeed(100);// 设置指定时间推送// message.setPushTime("201903271756");List<String> appIdList = new ArrayList<String>();appIdList.add(AppID);message.setAppIdList(appIdList);// 推送给App的目标用户需要满足的条件AppConditions cdt = new AppConditions();// 手机类型List<String> phoneTypeList = new ArrayList<String>();phoneTypeList.add("ANDROID");phoneTypeList.add("IOS");// 省份List<String> provinceList = new ArrayList<String>();// 50000000代表重庆市provinceList.add("50000000");// 设置手机类型筛选cdt.addCondition(AppConditions.PHONE_TYPE, phoneTypeList);// 设置省份筛选cdt.addCondition(AppConditions.REGION, provinceList);// 设置tag筛选cdt.addCondition(AppConditions.TAG, tagList);// 交并补// cdt.addCondition(AppConditions.PHONE_TYPE, phoneTypeList,// OptType.or);// cdt.addCondition(AppConditions.REGION, provinceList, OptType.or);// cdt.addCondition(AppConditions.TAG, tagList, OptType.or);message.setConditions(cdt);IPushResult ret = push.pushMessageToApp(message, "任务别名_toApp");System.out.println(ret.getResponse().toString());}

几个注意事项:

省份和城市编码,请参考官方文档

定速推送:旨在解决个推群推系统在全量推送时速度过快,导致部分客户服务器连接压力过大的问题。提供接口设置让用户按自身情况控制推送速度,如果未设置则按默认推送速度发送。

定时推送:对单个指定应用的所有用户群发推送消息。该消息可以在用户设定的时间点进行推送。此接口需要开通。

交并补设置:应用群推对于复杂的查询条件新增加的交并补功能,以对应查询语义中的与或非的关系

  • 场景:需要发送给城市在A,B,C里面,没有设置tagtest标签,手机型号为android的用户,用条件交并补功能可以实现,city(A|B|C) && !tag(tagtest) && phonetype(andriod)
  • 条件类型(OptType.or 或, OptType.and 与, OptType.not 非)

tag列表:上面有提到tag,tag就是给用户打的标签,可以实现按标签推送,tag的设置方式如下:

 public static void setTag(String cid, List<String> tagList) {IGtPush push = new IGtPush(HOST, AppKey, MasterSecret);IQueryResult ret = push.setClientTag(AppID, cid, tagList);System.out.println(ret.getResponse().toString());}

通过设置标签,所有终端都可以设置一个或者多个标签,进行标签推送时就会实现筛选作用。

群推就介绍到这里。

单推还有一种扩展形式,批量单推,用于一次创建提交多个单推任务。当单推任务较多时,推荐使用该接口,可以减少与服务端的交互次数。

 public static void pushBatch(String cid, String content) throws Exception {IIGtPush push = new IGtPush(HOST, AppKey, MasterSecret);IBatch batch = push.getBatch();try {// 构建透传消息constructClientTransMsg(cid, content, batch);// 构建点击通知打开网页消息constructClientLinkMsg(cid, content, batch);} catch (Exception e) {e.printStackTrace();}batch.submit();}
 private static void constructClientTransMsg(String cid, String msg, IBatch batch) throws Exception {SingleMessage message = new SingleMessage();TransmissionTemplate template = new TransmissionTemplate();template.setAppId(AppID);template.setAppkey(AppKey);template.setTransmissionContent(msg);// 这个Type为int型,填写1则自动启动apptemplate.setTransmissionType(1);message.setData(template);message.setOffline(true);message.setOfflineExpireTime(1 * 1000);// 设置推送目标,填入appid和clientIdTarget target = new Target();target.setAppId(AppID);target.setClientId(cid);batch.add(message, target);}
 private static void constructClientLinkMsg(String cid, String msg, IBatch batch) throws Exception {SingleMessage message = new SingleMessage();LinkTemplate template = new LinkTemplate();template.setAppId(AppID);template.setAppkey(AppKey);template.setTitle("title");template.setText("msg");template.setLogo("push.png");template.setLogoUrl("logoUrl");template.setUrl("url");message.setData(template);message.setOffline(true);message.setOfflineExpireTime(1 * 1000);// 设置推送目标,填入appid和clientIdTarget target = new Target();target.setAppId(AppID);target.setClientId(cid);batch.add(message, target);}

这样就可以实现一次服务端交互,完成多个单推任务,cid也可以是不同的,给不同的终端进行推送,推送内容也可以不同,这里为了简便就取的一样的。

个推java服务端核心API就介绍到这里,官网还有很多辅助API,查询统计,用户,推送结果等等,这里就不一一列举了,有这个需求的请移至官网文档详细阅读。

详解个推java服务端集成相关推荐

  1. java服务端集成信鸽推送

    java服务端集成信鸽推送 最近项目需要集成推送功能,突发奇想的选了信鸽推送(可能是最近一直在用阿里的东西),没想到这坑不是一般的多,而且关于详细的集成案例,度娘上真是没一个能入眼的.算了,别的不多说 ...

  2. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  3. java服务端集成极光消息推送

    极光推送官网地址:https://www.jiguang.cn/ api文档:https://docs.jiguang.cn/jpush/server/push/server_overview/ 1. ...

  4. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

  5. 微信小程序支付java服务端集成采坑总结

    先上个微信小程序支付官方文档地址: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8 重点看 ...

  6. Java服务端集成支付宝支付SDK

    文章目录 文档 流程说明 添加依赖 集成步骤 常见问题 文档 蚂蚁金服官方文档 https://docs.open.alipay.com/54/103419/https://docs.open.ali ...

  7. 集成推送(极光+小米+华为)总结(java服务端)

    公司app集成了极光推送,前前后后在这上面费了不少时间了,总结下自己的理解和遇到的问题.  只用过极光推送,所以下面都以极光推送为例.(后面新增小米和华为) 1..都有什么品牌的推送服务? 集成什么品 ...

  8. 使用极光推送实现分组发送和服务端集成

    推送功能在手机应用开发中越来越重要,几乎成为所有App必备的功能,由于Android本身没有消息推送机制,通常采用的是基于XMPP协议的推送,但这种开发很麻烦,因此在市场上应运而生了提供消息推送服务的 ...

  9. RabbitMQ详解以及spring对RabbitMQ的集成(附带部分源码解读)

    一·简介 1丶为什么要使用消息队列 https://wenku.baidu.com/view/e297236f83c4bb4cf7ecd193.html ①异步处理(高并发) ②系统解耦 ③流量削锋 ...

最新文章

  1. jqGrid + JSON + WebService 完整示例
  2. SQL Server定时执行SQL语句
  3. 量子计算机功率,量子计算功耗知多少
  4. 一般软件工程师怎样拥有更多的资产
  5. access 命令不符 等级考试_大学四年不白过,大家都在考这些(计算机等级考试电子书)...
  6. MFC小笔记:滑动条与编辑框
  7. 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?(转)
  8. win10怎么获得计算机权限,Win10如何获取TrustedInstaller超级权限?
  9. esp32触摸touch功能使用过程详述arduino
  10. 细数中国大学里的30个怪现状
  11. 智比奈特万兆光口网卡 ZB-10G-1F 驱动安装和带宽测试
  12. 计算机科学与技术专业图书,《计算机科学与技术专业毕业论文选》—甲虎网一站式图书批发平台...
  13. 联通服务器维护破解限速,网速1mbps(联通限速1mbps解除方法)
  14. JavaWeb Day02(动力节点)
  15. 小程序实现关注公众号的代码
  16. 一文8个步骤从0到1实现Python+Selenium自动化测试项目实战【建议收藏】
  17. heidisql ssh mysql_HeidiSQL连接到mysql服务器 – 丢失连接…服务器在读取初始
  18. 酒瓶中蜜蜂和苍蝇的故事
  19. 有用的东东---信用卡利息计算过程
  20. 中山地区的集装箱港口分布及航线

热门文章

  1. mysql不同连接的事务_mysql中不同事务隔离级别下数据的显示效果--转载
  2. JAVAWeb高校教师工作量统计系统
  3. 联想 linux u盘启动不了,联想bios设置u盘启动图文教程
  4. 三人帮共同纲领(The Creed Of Gang Of Three)导言
  5. 2021 春节放假通知
  6. 2023最让人期待的日历!每个IT技术人必备
  7. 卷积神经网络之4:VGG结构
  8. office2016之word中阿尔法α相关希腊字母的输入
  9. 颜色的前世今生5·色调和补色
  10. 正点原子STM32F103ZET6学习笔记-新建库函数工程模板