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

极光推送服务端Java集成所需jar包清单 在移动互联网时代,推送服务成为连接应用与用户的关键桥梁。极光推送服务就是这样一个现代通信平台,它使得开发者能够向他们的应用用户发送即时、个性化的消息。本章将探讨极光推送服务的核心优势,以及它如何在多变的移动市场中帮助提升用户参与度和应用活跃度。jpush-api.jar是极光推送服务的核心SDK,它为开发者提供了一套简洁易用的API接口,以便将推送功能集成到移动应用中。核心功能主要包括但不限于:推送消息到客户端(通知、自定义消息)推送消息到特定用户或用户群体。 阅读详情
  推送功能在手机应用开发中越来越重要,几乎成为所有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() {                

                @Override
                public 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() {                
                @Override
                public 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 block
                LOG.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);            
        }    
    }
极光推送,角标实现,服务器,Android端完整Demo 本次实现了用户登录注册,将用户保存到Application 里面实现用户持久化,用户有已读消息查看,未读消息查看,发送消息功能,未读消息读取后,添加到已读消息里面,发送消息具有 推送功能 可以全部发送,和选择人员发送,发送消息过后,如果当前用户在线会收到一条任务栏通知,点击通知可以查看到该消息,登录App时 ,APP应用会生成,未读信息角标,(实现了vivo和小米。 立即下载

相关推荐

Python-极光推送官方支持的Python版本服务器端SDK

极光推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动,从而有效地提高留存率,提升用户体验。平台提供整合了Android推送、iOS推送的统一推送服务。

关于极光推送的集成,以及实现标签、别名、ID的群推或个推的功能

首先我们要申请一个极光推送的账号,用自己项目的包名在控制台里创建一个自己的应用 创建好的应用界面如图下所示,在后面的配置中我们会用到这个appKey和secret     现在我们就可以在自己的项目里面集成了 我们去下载极光的sdk包,把sdk拷到我们相应的项目文件夹下,如下图所示: 现在我们开始配置我们的清单文件: 必需的权限 少不了: &lt;permission ...

android123it的博客 7157

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4896

android消息推送---JPush(极光推送)

1、Demo结构 2、

猛虎o蔷薇 1800

CloudFlare CDN优化延迟

这两天在倒腾一个小网站,因为刚注册的域名还没来得及备案,所以就解析到了国外的服务器临时撸代码。为了防止不必要的麻烦,所以在前端套了CloudFlare,但是延迟就比较感人了,通常在150+左右还时不时的抽风,所以就找了点资料来优化一下这个延迟问题。然后再新增一些CloudFlare的亚太地区节点ip的A解析,有耐心的可以分为电信线路和联通线路,我比较懒,所以只分了境内和默认。众所周知CloudFlare是智齿cname解析的,那么我们今天就要用到这个办法了,这里要注意一下,默认的解析是不能动的。

Zuozi - 网络从业者长见识就来Zuozi.NET 1086

自然二进制数与格雷码的相互转换

自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

Loudrs的博客 7494

Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)

一、别名(alias)介绍 (1)我们可以给每一个安装了应用程序的用户,取不同别名来标识(比如可以使用用户账号的userid 来作为别名)。 (2)以后给某个特定用户推送消息时,就可以用此别名来指定。 (3)每个用户只能指定一个别名。所以同一个设备,新设置的别名会覆盖旧的。 (4)如果要删除已有的别名,只要将别名设置为空字符串即可。 (5)系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端API会同时给这多个用户发送消息。 二、别名使用...

az44yao的专栏 1644

基于Zemax的干涉仪仿真——Fizeau球面干涉仪

最近在用Zemax仿真干涉仪,在这之前查资料都是关于一些平面干涉仪的仿真,很少有关于Fizeau型的,尤其是球面干涉仪的仿真,看到很多关于这方面的问题回复都说利用多重结构仿照Zemax马赫-泽德干涉仪去做,但是也没有具体的过程,因此在这里分享一下我仿真的干涉仪步骤方法,具体是利用多重结构完成的仿真。

weixin_46657737的博客 6410

java服务端集成极光推送-通知(2) : java代码代码实现客户端推送

1、添加极光的maven依赖 <dependency> <groupId>cn.jpush.api</groupId> <artifactId>jpush-client</artifactId> <version>3.3.10</version> </dependency> ...

qq_36603505的博客 514

DCDC系列(一): COT DCDC基本原理

电流环DCDC属于双环控制模式,根据电流检测的位置,分为峰值电流环控制模式、谷值电流环控制模式和平均电流环控制模式,主要由输出电压反馈环和电流环两个环路来实现控制,其瞬态响应比电压环更好,且有自动限流的功能,但仍需要斜坡补偿网络,且对噪声敏感。Stage3: 在下管NMOS打开阶段,由于后级负载此时间段内消耗的电量较少,所以VFB还未低至Vref,所以此阶段中,上管PMOS和下管NMOS均处于关断状态,此时的电感电流为0mA,此阶段测的VSW上的电压就是Cout上的电压VREG;

weixin_40073649的博客 3948

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 1006

关于极光推送 客户端以及服务器端的搭建和设置

使用极光推送实现分组发送和服务端集成 摘自:http://blog.youkuaiyun.com/qq_24908939/article/details/42743145 分类: Java Android2015-01-15 16:35 152人阅读 评论(0) 收藏 举报 Web前端框架Androidiosandroid开发 目录(?)[+]

ice_coffee_mzp的博客 1405

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

伶俐角少儿编程 731

极光推送实现分组发送和服务端集成

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

1770

R数据分析:潜在剖面分析LPA的做法与解释

Latent Profile Analysis (LPA) tries to identify clusters of individuals (i.e., latent profiles) based on responses to a series of continuous variables (i.e., indicators). LPA assumes that there are unobserved latent profiles that generate patterns of resp.

Codewar的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java 集成极光推送

为什么需要推送 现在手机App中,每天都能收到大量的推送,这种推送是让用户了解app最新活动与消息,也是提醒用户参与活动并使用app的一个方法,在app中是必不可少的。公司开发app当然也需要使用一种推送工具来给用户发送通知,并与用户互动,公司选用的推送就是极光推送。 极光推送 极光推送是极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供移动消息推送服务。 ...

weixin_40087279的博客 3825

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【极光推送】给指定用户发送消息

前言 如果你还没有搭建极光推送服务器,建议你根据情况,先从服务器搭建开始。 前文标题: 《【极光推送】jpush服务端开发详尽过程》 链接: http://ningmengjiabing.blog.163.com/blog/static/20484719820163194218972/ 如果你已经完成推送服务器的搭建,最后在验证推送功能时,返回的options大致格式...

skiof007的专栏 3145

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java向指定用户极光推送_【极光推送】给指定用户发送消息

前言如果你还没有搭建极光推送服务器,建议你根据情况,先从服务器搭建开始。前文标题:《【极光推送】jpush服务端开发详尽过程》链接:如果你已经完成推送服务器的搭建,最后在验证推送功能时,返回的options大致格式应该如下所示:{"sendno":1525934458,"apns_production":false}出现这个东东的原因:1.我们并未在极光推送(https://www.jpush....

weixin_35577004的博客 351
上一篇: Android自定义ViewGroup之子控件的自动换行和添加删除
下一篇: Android开发之如何保证Service不被杀掉(broadcast+system/app)
codepython
博客等级 码龄20年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值