java SDK服务端推送 --极光推送(JPush)

        消息推送在APP应用中越来越普遍,来记录一下项目中用到的一种推送方式,对于Andriod它并没有自己的原生推送机制,一种简单的推送方式是采用第三方推送服务的方式,即通过嵌入SDK使用第三方提供的推送服务,主流的有百度云推送,极光推送,友盟,个推、亚马逊等等。本篇博文只介绍采用极光推送的方式。

        如果你是一个新手,建议你先看完本篇博客,然后在去看官网,这样也许上手会快一些。

关键步骤:

1.在极光官网先注册一个账号,创建一个应用,获取AppKey、Master Secret (官网:https://www.jiguang.cn/)

2.在java项目中导入依赖的jar包,如果你是maven项目,在pom文件中添加依赖即可。

3.创建一个JPushUtil类,代码放在下面。

 

详细步骤

1.登录极光官网,注册一个账号

2.选择“开发者服务”—“极光推送”—“立即体验”

java SDK服务端推送 --极光推送(JPush)_第1张图片

 

3.创建一个应用

java SDK服务端推送 --极光推送(JPush)_第2张图片

4.点击新创建的应用,获取AppKey和Master Secret

 

java SDK服务端推送 --极光推送(JPush)_第3张图片

5.在java项目中导入依赖包,(可参考官网:https://docs.jiguang.cn/jpush/server/sdk/java_sdk/#_2)

maven 方式

将下边的依赖条件放到你项目的 maven pom.xml 文件里。


    cn.jpush.api
    jpush-client
    3.3.9

jar 包方式

请到 Release页面下载相应版本的发布包。

依赖包

  • slf4j / log4j (Logger)
  • gson (Google JSON Utils)

其中 slf4j 可以与 logback, log4j, commons-logging 等日志框架一起工作,可根据你的需要配置使用。

如果使用 Maven 构建项目,则需要在你的项目 pom.xml 里增加:

    
        cn.jpush.api
        jiguang-common
        1.1.3
    
    
        io.netty
        netty-all
        4.1.6.Final
        compile
    
    
        com.google.code.gson
        gson
        2.3
    
    
        org.slf4j
        slf4j-api
        1.7.7
    

    
    
        org.slf4j
        slf4j-log4j12
        1.7.7
    
    
        log4j
        log4j
        1.2.17
    

如果不使用 Maven 构建项目,则项目 libs/ 目录下有依赖的 jar 可复制到你的项目里去。

6.创建JPushUtil类,该类中给出了使用与Android和ios的方法,以及两者都适用的方法,代码如下:


/**
 * 极光推送工具类
 * Created by DUYU on 2019/1/17.
 */
public class JPushUtil {

    // 设置好账号的app_key和masterSecret是必须的
    private static String APP_KEY = "fcc67*************ba80d76";
    private static String MASTER_SECRET = "a4c45*************cc0";


    //极光推送>>Android
    //Map parm是我自己传过来的参数,可以自定义参数
    public static void jpushAndroid(Map parm) {

        //创建JPushClient(极光推送的实例)
        JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
        //推送的关键,构造一个payload
        PushPayload payload = PushPayload.newBuilder()
                .setPlatform(Platform.android())//指定android平台的用户
                .setAudience(Audience.all())//你项目中的所有用户
//                .setAudience(Audience.alias(parm.get("alias")))//设置别名发送,单发,点对点方式
                //.setAudience(Audience.tag("tag1"))//设置按标签发送,相当于群发
//                .setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户

                .setNotification(Notification.android(parm.get("msg"), parm.get("title"), parm))  //发送内容
                .setOptions(Options.newBuilder().setApnsProduction(true).setTimeToLive(7200).build())
                // apnProduction指定开发环境 true为生产模式 false 为测试模式 (android不区分模式,ios区分模式) 不用设置也没关系
                // TimeToLive 两个小时的缓存时间
                .setMessage(Message.content(parm.get("msg")))//自定义信息
                .build();

        try {
            PushResult pu = jpushClient.sendPush(payload);
            System.out.println(pu.toString());
        } catch (APIConnectionException e) {
            e.printStackTrace();
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
    }

    //极光推送>>ios
    //Map parm是我自己传过来的参数,可以自定义参数
    public static  void jpushIOS(Map parm) {

        //创建JPushClient
        JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
        PushPayload payload = PushPayload.newBuilder()
                .setPlatform(Platform.ios())//ios平台的用户
                .setAudience(Audience.all())//所有用户
                //.setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(IosNotification.newBuilder()
                                .setAlert(parm.get("msg"))
                                .setBadge(+1)
                                .setSound("happy")//这里是设置提示音(更多可以去官网看看)
                                .addExtras(parm)
                                .build())
                        .build())
                .setOptions(Options.newBuilder().setApnsProduction(false).build())
                .setMessage(Message.newBuilder().setMsgContent(parm.get("msg")).addExtras(parm).build())//自定义信息
                .build();

        try {
            PushResult pu = jpushClient.sendPush(payload);
            System.out.println(pu.toString());
        } catch (APIConnectionException e) {
            e.printStackTrace();
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
    }



    //极光推送>>All所有平台
    public static void jpushAll(Map parm) {

        //创建JPushClient
        JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
        //创建option
        PushPayload payload = PushPayload.newBuilder()
                .setPlatform(Platform.all())  //所有平台的用户
                .setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户
                .setNotification(Notification.newBuilder()
                        .addPlatformNotification(IosNotification.newBuilder() //发送ios
                                .setAlert(parm.get("msg")) //消息体
                                .setBadge(+1)
                                .setSound("happy") //ios提示音
                                .addExtras(parm) //附加参数
                                .build())
                        .addPlatformNotification(AndroidNotification.newBuilder() //发送android
                                .addExtras(parm) //附加参数
                                .setAlert(parm.get("msg")) //消息体
                                .build())
                        .build())
                .setOptions(Options.newBuilder().setApnsProduction(true).build())//指定开发环境 true为生产模式 false 为测试模式 (android不区分模式,ios区分模式)
                .setMessage(Message.newBuilder().setMsgContent(parm.get("msg")).addExtras(parm).build())//自定义信息
                .build();
        try {
            PushResult pu = jpushClient.sendPush(payload);
            System.out.println(pu.toString());
        } catch (APIConnectionException e) {
            e.printStackTrace();
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
    }

}

7.DEMO测试类

public class demo {

    public static void main(String[] args) {

        //设置推送参数
        //这里可以自定义推送参数了
        Map parm = new HashMap();
        //设置提示信息,内容是文章标题
        parm.put("msg","收到请联系发送人");
        parm.put("title","这里是title");
        parm.put("alias","abc");
        JPushUtil.jpushAndroid(parm);
    }

}

测试结果:

java SDK服务端推送 --极光推送(JPush)_第4张图片

8.极光后台查看

在极光后台可以查看推送历史,登录极光后台,在应用的下方点击“推送”

java SDK服务端推送 --极光推送(JPush)_第5张图片

选择Api

java SDK服务端推送 --极光推送(JPush)_第6张图片

点击“操作”查看详情

java SDK服务端推送 --极光推送(JPush)_第7张图片

java SDK服务端推送 --极光推送(JPush)_第8张图片

9。参数信息:

(来自于官方文档https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/#platform)

platform:推送平台

JPush 当前支持 Android, iOS, Windows Phone 三个平台的推送。其关键字分别为:"android", "ios", "winphone"。

如果目标平台为 iOS 平台,推送 Notification 时需要在 options 中通过 apns_production 字段来设定推送环境。True 表示推送生产环境,False 表示要推送开发环境; 如果不指定则为推送生产环境;一次只能推送给一个环境。

 

推送到所有平台:

{ "platform" : "all" }

指定特定推送平台:

{ "platform" : ["android", "ios"] }

 

audience:推送目标

推送设备对象,表示一条推送可以被推送到哪些设备列表。确认推送设备对象,JPush 提供了多种方式,比如:别名、标签、注册 ID、分群、广播等。

all

如果要发广播(全部设备),则直接填写 “all”。

推送目标

广播外的设备选择方式,有如下几种:

关键字 类型 含义 说明 备注
tag JSON Array 标签OR 数组。多个标签之间是 OR 的关系,即取并集。 用标签来进行大规模的设备属性、用户属性分群。 一次推送最多 20 个。
  • 有效的 tag 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符@!#$&*+=.|¥。
  • 限制:每一个 tag 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码)
tag_and JSON Array 标签AND 数组。多个标签之间是 AND 关系,即取交集。 注意与 tag 区分。一次推送最多 20 个。
tag_not JSON Array 标签NOT 数组。多个标签之间,先取多标签的并集,再对该结果取补集。 一次推送最多 20 个。
alias JSON Array 别名 数组。多个别名之间是 OR 关系,即取并集。 用别名来标识一个用户。一个设备只能绑定一个别名,但多个设备可以绑定同一个别名。一次推送最多 1000 个。
  • 有效的 alias 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符@!#$&*+=.|¥。
  • 限制:每一个 alias 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码)
registration_id JSON Array 注册ID 数组。多个注册 ID 之间是 OR 关系,即取并集。 设备标识。一次推送最多 1000 个。客户端集成 SDK 后可获取到该值。
segment JSON Array 用户分群 ID 在页面创建的用户分群的 ID。定义为数组,但目前限制一次只能推送一个。 目前限制是一次只能推送一个。
abtest JSON Array A/B Test ID 在页面创建的 A/B 测试的 ID。定义为数组,但目前限制是一次只能推送一个。 目前限制一次只能推送一个。

 

以上几种类型至少需要有其一。如果值数组长度为 0,表示该类型不存在。

这几种类型可以并存,多项的隐含关系是 AND,即取几种类型结果的交集。

例如:

"audience" : { "tag" : [ "tag1", "tag2" ], "tag_and" : [ "tag3", "tag4"], "tag_not" : [ "tag5", "tag6"] }

先计算 "tag" 字段的结果 tag1或tag2=A;

再计算 "tag_and" 字段的结果 tag3且tag4=B;

再计算 "tag_not" 字段的结果 非(tag5或tag6)=C

"audience" 的最终结果为 A且B且C 。

notification:通知

 

message:自定义消息

 

options:可选参数

推送可选项。

当前包含如下几个可选项:

关键字 类型 选项 含义 说明
sendno int 可选 推送序号 纯粹用来作为 API 调用标识,API 返回时被原样返回,以方便 API 调用方匹配请求与返回。值为 0 表示该 messageid 无 sendno,所以字段取值范围为非 0 的 int.
time_to_live int 可选 离线消息保留时长(秒) 推送当前用户不在线时,为该用户保留多长时间的离线消息,以便其上线时再次推送。默认 86400 (1 天),最长 10 天。设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到。该字段对 iOS 的 Notification 消息无效。
override_msg_id long 可选 要覆盖的消息 ID 如果当前的推送要覆盖之前的一条推送,这里填写前一条推送的 msg_id 就会产生覆盖效果,即:1)该 msg_id 离线收到的消息是覆盖后的内容;2)即使该 msg_id Android 端用户已经收到,如果通知栏还未清除,则新的消息内容会覆盖之前这条通知;覆盖功能起作用的时限是:1 天。如果在覆盖指定时限内该 msg_id 不存在,则返回 1003 错误,提示不是一次有效的消息覆盖操作,当前的消息不会被推送;该字段仅对 Android 有效。
apns_production boolean 可选 APNs 是否生产环境 True 表示推送生产环境,False 表示要推送开发环境;如果不指定则为推送生产环境。但注意,JPush 服务端 SDK 默认设置为推送 “开发环境”。该字段仅对 iOS 的 Notification 有效。
apns_collapse_id string 可选 更新 iOS 通知的标识符 APNs 新通知如果匹配到当前通知中心有相同 apns-collapse-id 字段的通知,则会用新通知内容来更新它,并使其置于通知中心首位。collapse id 长度不可超过 64 bytes。
big_push_duration int 可选 定速推送时长(分钟) 又名缓慢推送,把原本尽可能快的推送速度,降低下来,给定的 n 分钟内,均匀地向这次推送的目标用户推送。最大值为 1400。未设置则不是定速推送。

你可能感兴趣的:(Java基础)