博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解个推java服务端集成(干货)
阅读量:4257 次
发布时间:2019-05-26

本文共 9494 字,大约阅读时间需要 31 分钟。

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、可加微信技术交流群、QQ技术交流群(183198395)。

一、简介

个推是商用级的移动应用消息推送云服务解决方案,客户端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与APPKEY		template.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与APPKEY		template.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则自动启动app		return 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
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
targets = new ArrayList
(); Target target = null; for (String cid : cids) { target = new Target(); target.setAppId(AppID); target.setClientId(cid); targets.add(target); // target.setAlias(Alias1); } // taskId用于在推送时去查找对应的message String 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
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
appIdList = new ArrayList
(); appIdList.add(AppID); message.setAppIdList(appIdList); // 推送给App的目标用户需要满足的条件 AppConditions cdt = new AppConditions(); // 手机类型 List
phoneTypeList = new ArrayList
(); phoneTypeList.add("ANDROID"); phoneTypeList.add("IOS"); // 省份 List
provinceList = new ArrayList
(); // 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
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则自动启动app		template.setTransmissionType(1);		message.setData(template);		message.setOffline(true);		message.setOfflineExpireTime(1 * 1000);		// 设置推送目标,填入appid和clientId		Target 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和clientId		Target target = new Target();		target.setAppId(AppID);		target.setClientId(cid);		batch.add(message, target);	}

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

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

转载地址:http://cvtei.baihongyu.com/

你可能感兴趣的文章
JVM——深入解析原理和运行机制(一)类加载器
查看>>
VB与flash的交互
查看>>
番茄工作法
查看>>
SQL Server 错误:18456。用户“sa”登录失败
查看>>
SQL Server 2008阻止保存要求重新创建表的更改的解决
查看>>
学生信息管理系统之数据库远程使用
查看>>
如何做一名优秀的程序员
查看>>
【C++】C++11新增关键字详解
查看>>
【Ubuntu】VirtualBox显卡驱动VBoxVGA、VBoxSVGA、VMSVGA +3D对播放视频的影响
查看>>
【Gstreamer】在虚拟机中无法使用硬件加速:gstreamer1.0-vaapi
查看>>
免费图标查询、下载的网站
查看>>
【经验】Lenovo/ThinkPad 进入BIOS的方法汇总
查看>>
【Qt】QPixmap加载图片报错:Corrupt JPEG data: premature end of data segment Didn't expect more than one scan
查看>>
【Ubuntu】ubuntu设置GUI程序自启动
查看>>
【Ubuntu】ping: unknown host www.baidu.com
查看>>
【Qt】qss样式表之:QCalendarWidget,日历窗口样式表设置
查看>>
【Qt】qss样式表之:自定义属性实现动态切换样式
查看>>
【GStreamer】基本概念及安装
查看>>
【GStreamer】gstreamer工具详解之:gst-launch-1.0
查看>>
【GStreamer】gstreamer工具详解之:gst-inspect-1.0
查看>>