推送功能在手机应用开发中越来越重要,几乎成为所有App必备的功能,由于Android本身没有消息推送机制,通常采用的是基于XMPP协议的推送,但这种开发很麻烦,因此在市场上应运而生了提供消息推送服务的诸多产品,例如:百度云、个推、极光等。

  极光推送正是一个整合了Android推送、iOS推送的统一推送服务平台。下面讲解一下如何使用极光实现消息推送应用,并重点讲解一下如何实现向分组发送消息及推送服务端和自身应用集成,具体实现过程如下:

目录:

一、注册应用

二、环境搭建

三、Android开发,实现指定人群推送消息

四、开发消息推送服务端

  1、环境搭建

  2、服务端实现步骤

  3、服务端代码实现

一、注册应用

1.进入官网

   首先进入官网首页https://www.jpush.cn/,注册账号

2.注册应用

  登录到用户平台,点击创建应用如图所示:

  包名:创建应用项目的基础包,单击创建,产生应用信息如图所示:

  产生AppKey和API主密码,每个客户端应用使用唯一一个AppKey

二、环境搭建

1.SDK下载

  官网资源地址: https://www.jpush.cn/downloads/sdk/android/  下载 JPUSH Android – SDK。

2.导入SDK开发包

  •   复制 libs/jpush-sdk-release1.x.y.jar 到工程 libs/ 目录下
  •   复制 libs/armeabi/libjpush.so 到工程 libs/armeabi 目录下

3.配置AndroidManifest.xml

  详细请参照官网http://docs.jpush.io/guideline/android_guide/#sdk文档中说明进行配置

4.测试是否成功

   集成完成后,JPush  提供的推送服务是默认就已经开启,这时客户端就可以接收到来自服务的消息了,可通过登录到JPush用户平台,发送通知测试集成是否成功

  如图所示:

  如终端收到消息说明集成成功

三、Android端开发,实现向指定人群推送消息

  集成成功之后,服务端发送消息会被所有的安装应用的客户端所接收,我们再继续看看如何在应用中向指定的人群进行消息推送?

要指定向某一个特定的人,或者某一群特定的人,则相对复杂。因为对于 JPush 来说,某一个人就是一个注册ID,这个注册ID与开发者App没有任何关系,或者说对开发者App是没有意义的。

  如果要对开发者App有意义的某个特定的用户推送消息,则需要:把 JPush 注册用户与开发者App 用户绑定起来。我们可以使用别名与标签的功能

1.设置别名(alias)

  为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。每个用户只能指定一个别名。同一个应用中,尽可能为每个客户端用户标识唯一名称,以便服务端能通过该名称来唯一确定用户。

  调用JPushInterface方法:

public static void setAlias(Context context, String alias,  TagAliasCallback callback)

 参数说明:

  • Alias 设置别名

    • 实现TagAliasCallback的组件对象, 该组件提实现 gotResult 方法。采用回调机制返回执行结果,对应的参数
    • responseCode状态码:0为成功
    • Alias别名称
    • Tags标签名,没有为null
    • "" (空字符串)表示取消之前的设置。
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • callback

  如下所示:

new TagAliasCallback() {                @Overridepublic void gotResult(int responseCode, String alias, Set<String> tags) {switch (code) {case 0:logs = "Set tag and alias success";Log.i(TAG, logs);break;case 6002:logs = "Failed to set alias and tags due to timeout. Try again after 60s.";Log.i(TAG, logs);break;default:logs = "Failed with errorCode = " + code;Log.e(TAG, logs);}
}
}

2.设置标签(tag)

  标签实质就是将应用客户根据应用的需要按类别进行分组,服务端可以组为单位来批量下发 Push 消息,这样组内客户端所有用户都可以收到该消息。一个用户可以打多个标签,标签没有唯一性要求。

  调用JPushInterface方法:

public static void setTags(Context context, Set<String> tags,TagAliasCallback callback)

 参数说明:

  • Tags 为用户设置组,一个用户可设置多个组

    • 空数组或列表表示取消之前的设置。
    • 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码)
  • Callback 同上

3.同时设置组和标签

  也可调用JPushInterface的setAliasAndTags方法同时设置别名和标签,方法如下:

 public static void setAliasAndTags(Context context, String alias,  Set<String> tags, TagAliasCallback callback)

  案例实现:

  下面代码实现为登录的学生设置别名和标签,别名为其学号,每个用户有两个标签分别是所属班级和所属专业,user是用户登录成功后的信息

if(user!=null){// TODO
Set<String> tags=new HashSet<String>();
if(user.getClassName()!=null&&!user.getClassName().equals("")){tags.add(user.getClassName());//记录学生所属班级
}
if(user.getMajorName()!=null&&!user.getMajorName().equals("")){tags.add(user.getMajorName());//记录学生所属专业
}
//将学生设置到班级和专业组,并设置别名为学生的学号
JPushInterface.setAliasAndTags(getApplicationContext(), user.getUserNo(),tags, new TagAliasCallback() {                @Overridepublic void gotResult(int responseCode, String alias, Set<String> tags) {// TODO if(responseCode==0){Log.i("tags", tags.toString());}}});}

  这样服务端可以以专业和班级为单位实现批量发送消息,也可以按学号向指定学生发消息

四、开发消息推送服务端

环境搭建

1.下载服务端SDK

  下载地址: http://docs.jpush.cn/download/attachments/2228302/jpush-client-3.2.3.zip?version=2&modificationDate=1415166491000

2.在项目中加入jar包

服务端实现步骤

1.创建JPushClient

JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3);

 参数说明:

masterSecret:注册应用的主密码,即API 主密码

appKey:注册应用的应用Key

maxRetryTime:最大的尝试次数,设为3表示:跟服务器进行建立连接若失败会尝试再进行两次尝试

2. 构建一个PushPayload对象(推送对象)

  确定推送消息的目标,包括推送的平台(Android、IOS)、消息内容和目标(所有人、别名、标签),构建简单的推送对象:向所有平台,所有人,推送内容为 content 的通知。

 public static PushPayload buildPushObject_all_all_alert(String content) {return PushPayload.alertAll(content); 

  构建推送对象:所有平台,推送目标是别名为alias,通知内容为 content。

 public static PushPayload buildPushObject_all_alias_alert(String alias,String content) {return PushPayload.newBuilder().setPlatform(Platform.all())//所有平台.setAudience(Audience.alias(alias))//向选定的人推送.setNotification(Notification.alert(content))//消息内容.build();}

  构建推送对象:向android平台,向目标标签tag,通知标题title,内容为 content。

 public static PushPayload buildPushObject_android_tag_alertWithTitle (String alias,String title,String content) {return PushPayload.newBuilder().setPlatform(Platform.android()).setAudience(Audience.tag(tag))//向指定的组推送.setNotification(Notification.android(message, title, null)).build();
}

3.推送消息

PushResult result=jpushClient.sendPush(payload);

  应用客户推送消息

    参数:payload 即第二步创建的推送对象

    返回值:PushResult 表示服务端推送结果

  包含下列数据:

   msg_id:返回推送消息的id

服务端代码实现

1.编写MessagePush组件封装消息推送方法

public class MessagePush {private static final String appKey = "d1c241706d82996e1fcdc2b2";private static final String masterSecret = "7ee1df1a631aee5a6a5a1129";private JPushClient jpushClient ;private String title;private String content;
public MessagePush(String message) {this.message = message;    jpushClient = new JPushClient(masterSecret, appKey,3);}public MessagePush(String message,String title) {
this(message);        this.title=title;    }
/*** 向所有人发送消息* @return 消息id*/
public long sendPushAll(){PushPayload payload=buildPushObject_all_all_alert();long msgId=0;try {PushResult result=jpushClient.sendPush(payload);msgId=result.msg_id;} catch (APIConnectionException e) {// TODO Auto-generated catch blockLOG.error("Connection error. Should retry later. ", e);} catch (APIRequestException e) {LOG.info("HTTP Status: " + e.getStatus());msgId=e.getMsgId();}return msgId;}
/*** 向指定别名的客户端发送消息* @param alias 所有别名信息集合,这里表示发送所有学生编号* @return 消息id*/public long sendPushAlias(Set<String> alias){PushPayload payloadAlias=buildPushObject_android_alias_alertWithTitle(alias);long msgId=0;try {PushResult result=jpushClient.sendPush(payloadAlias);msgId=result.msg_id;} catch (APIConnectionException e) {LOG.error("Connection error. Should retry later. ", e);} catch (APIRequestException e) {LOG.info("HTTP Status: " + e.getStatus());LOG.info("Error Code: " + e.getErrorCode());LOG.info("Error Message: " + e.getErrorMessage());LOG.info("Msg ID: " + e.getMsgId());msgId=e.getMsgId();}return msgId;}/*** 向指定组发送消息* @param tag 组名称
* @return 消息id
*/
public  long sendPushTag(String tag) {PushPayload payloadtag = buildPushObject_android_tag_alertWithTitle(tag);long msgId=0;try {PushResult result = jpushClient.sendPush(payloadtag);msgId=result.msg_id;LOG.info("Got result - " + result);} catch (APIConnectionException e) {LOG.error("Connection error. Should retry later. ", e);} catch (APIRequestException e) {LOG.info("HTTP Status: " + e.getStatus());LOG.info("Error Code: " + e.getErrorCode());LOG.info("Error Message: " + e.getErrorMessage());LOG.info("Msg ID: " + e.getMsgId());msgId=e.getMsgId();}return msgId;}/**
* 下列封装了三种获得消息推送对象(PushPayload)的方法
*  buildPushObject_android_alias_alertWithTitle、
*  buildPushObject_android_tag_alertWithTitle、
*  buildPushObject_all_all_alert
*/
public  PushPayload buildPushObject_android_alias_alertWithTitle(Set<String> alias) {return PushPayload.newBuilder().setPlatform(Platform.android()).setAudience(Audience.alias(alias))        .setNotification(Notification.android(message,title,null)).build();
}public  PushPayload buildPushObject_android_tag_alertWithTitle(String tag){return PushPayload.newBuilder().setPlatform(Platform.android()).setAudience(Audience.tag(tag)).setNotification(Notification.android(message, title, null)).build();}public  PushPayload buildPushObject_all_all_alert() {return PushPayload.alertAll(message);}

2.JSP页面

   主要是设计表单将数据提交给MessagePushServlet,这里页面代码就不附加了

3.编写Servlet

public class MessagePushServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {int ret=0;request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String title=request.getParameter("title");String msg=request.getParameter("msg");String major=request.getParameter("majorName");String stuClass=request.getParameter("className");String alias=request.getParameter("selStuNos");MessagePush push=new MessagePush(msg,title);long msgId=0;if(alias!=null&&!alias.equals("")){String[] aliasArr=alias.split(",");Set<String> aliasSet=new HashSet<String>();for(String item:aliasArr){aliasSet.add(item);}msgId=push.sendPushAlias(aliasSet);}else if(stuClass!=null&&!stuClass.equals("")){msgId=push.sendPushTag(stuClass);}else if(major!=null&&!major.equals("")){msgId=push.sendPushTag(major);} else{msgId=push.sendPushAll();            }request.getRequestDispatcher("/push.jsp").forward(request, response);            }    }

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jerehedu/p/4210785.html

使用极光推送实现分组发送和服务端集成相关推荐

  1. android 极光推送测试,Android 3分钟带你集成极光推送

    话不多说 首先申请极光的账号,(官方地址:https://www.jiguang.cn) 1561710140829.png 登录完成之后,先看到这个地方 ,我个人比较喜欢用旧版本,这里点击旧版 15 ...

  2. 物联网设备数据流转之数据如何实时推送至前端:WebSocket服务端推送

    背景 还记得,我们在物联网设备数据流转之实时数据从哪里来.如何转发:Node.js, MQTT, EMQX的WebHook这篇文章中,当 EMQX 的 WebHook 收到来自设备的消息时,我们当时只 ...

  3. 极光推送 请检查参数合法性_极光小课堂 | 极光推送在人脸识别终端管理系统中的应用...

    项目背景 最近开发的一款人脸识别终端管理系统,主要包括运营平台.企业后台管理系统.APP 端.智能人脸识别终端模块. 下图是系统的架构图: 其中各个模块之间都需要即时通讯,比如: APP 端用户注册完 ...

  4. 个推和极光推送技术介绍

    一.概念 1.早期推送服务 在移动互联网以前的手机,如果有事情发生要通知用户,则会弹出一个窗口,告诉用户正在发生的事,可能是未接电话提示.日历提醒或是一封彩信.推送功能最早是被用于Email中,而目前 ...

  5. iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷) (1)首先说一下推送的一些原理: Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指 ...

  6. 极光推送在Android端的集成

    这个周末,是最颓废的一个周末了.工作以来,基本每个周末都会学习点知识或者总结些东西.这个周末,身体不是很舒服,结果躺床上打了两天农药,也没有写博客.今天周一,正好我工作不忙,把上周末的博客补上.今天的 ...

  7. Android第三方SDK集成 —— 极光推送

    前言: 本文前篇,可以帮助朋友们快速集成极光推送.本文后篇,是我自己项目实践的一些总结和心得,应该对读者们还是很有参考价值的,相信读完这篇文章,你会对极光推送有更加深入的理解,而不仅仅只是会集成而已. ...

  8. Android之集成极光推送消息

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式: 通知 自定义消息 富媒体 本地通知 1.通知 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通 ...

  9. Android接入极光推送,接入华为,小米,OPPO,VIVO厂商通道

    极光推送作用: 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度.提高应用的留存率 主要作用: 保持与服 ...

最新文章

  1. python__基础 : 异常处理与自定义异常
  2. Java对象的序列化与反序列化
  3. 别眨眼!AI 通过自学秒解魔方,比人类纪录快两倍
  4. python tkinter选择路径控件_如何使用tkinter在Python中选择目录并存储位置
  5. 将springboot打包成的jar文件做成windows服务
  6. 基于Altium Designer的4层PCB板的绘制
  7. 数据结构python语言描述课后答案_《数据结构与算法Python语言描述》习题第二章第三题(python版)...
  8. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  9. 093 一个人的固执里,藏着低水平的认知
  10. [经验]iOS开发-记录下在开发过程中遇到的问题的解决方案及经验总结-1
  11. 服务器重启后jar包自动重启
  12. excel文档损坏打不开的原因是什么?
  13. 看了 Google 大神 Jeff Dean 的传说,我拜服了~
  14. 262Echarts - 3D 路径图(Flights on Geo3D)
  15. 正规的棋牌游戏开发公司需要具备哪些条件
  16. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)
  17. Java学习路线以及方法推荐
  18. 湖南省第六届大学生计算机程序设计竞赛 弟弟的作业
  19. 【小龙】我想走一条不同的路,我要走我自己的路——大二转专业计院学生的个人思考
  20. java里remark是什么意思_remark是什么意思?

热门文章

  1. 亲测SQLServer的最大连接数
  2. 让协同工作更加轻松——Office 2007面面观之(8)
  3. java 原子量_Java線程:新特征-原子量
  4. Oracle SID爆破工具SidGuess
  5. mysql 导出gbk_把mysql 中的字符gb2312 改为gbk的方法
  6. python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)
  7. 卡尔曼滤波对gps轨迹数据清洗_卡尔曼滤波:从入门到精通
  8. iphone圆点怎么弄出来_新款iPhone放出终极大招,果粉:就没高级点的嘛
  9. 人机交互时,你认为机器人是有意识的还是无意识的?
  10. 30岁二刷博士,17个月发6篇一作获顶会最佳!现实版人生重开模拟器