服务端整合极光推送

倖福魔咒の 提交于 2020-01-16 08:51:56

服务端整合极光推送

一、前言

1.1 推送目标

极光文档:http://docs.jiguang.cn/jpush/guideline/intro/

通过使用标签,别名,Registration ID 和用户分群,开发者可以向特定的一个或多个用户推送消息。

  • 标签
    为安装了应用程序的用户打上标签,其目的主要是方便开发者根据标签,来批量下发 Push 消息。 可为每个用户打多个标签。 举例: game, old_page, women

  • 别名
    每个用户只能指定一个别名。 同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。

  • Registration ID
    客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的)。开发者可以通过指定具体的 Registration ID 来进行对单一设备的推送。

  • 用户分群
    用户分群的筛选条件有:标签、地理位置、活跃用户、系统版本、智能标签。 比如,开发者可以设置这样的用户分群:位于北京、上海、广州和深圳,并且最近 7 天内的活跃用户。 开发者可以通过在控制台设置好用户分群之后,在控制台推送时指定该分群的名称或使用 API 调用该分群的 id 发送。

1.2 推送方式

这里只是对具体场景应用简单描述,设计一下。

我们的消息分为三类,一类是通知消息,给所有人。另一类是具体的工作安排,给某一部门的人。还有一类是具体的个人消息,如给领导发请假通知等。所以我们最终决定使用的方式包括一下方式:

1) 广播:顾名思义就是给所有人群发消息

2) 别名(alias):给指定id的终端设备发送消息。别名需要客户端进行设置。

3) 标签(tag):分组发送消息,理解起来应该类似于微信建了一个群聊的赶脚。标签需要客户端进行设置。

1.3 设计规则

客户端开发步骤简述

  1. 集成SDK(之前已经完成)

  2. 启动后,到服务器上注册,并获取注册ID(RegistrationID)

  3. 调用Method - setAliasAndTags (with Callback)函数完成别名和标签的设置。

注1:这里,我们应用的别名就是员工ID,标签就是部门ID。以此来进行分类推送
使用员工ID别名推送给具体某一个用户,使用部门ID推送给某一类人

二、服务端开发

2.1 极光推送maven包

<!-- 极光推送 -->
<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jpush-client</artifactId>
    <version>3.2.17</version>
</dependency>

<dependency>
    <groupId>cn.jpush.api</groupId>
    <artifactId>jiguang-common</artifactId>
    <version>1.0.3</version>
</dependency>

<!-- netty -->
<dependency>
   <groupId>io.netty</groupId>
   <artifactId>netty-all</artifactId>
   <version>4.1.6.Final</version>
   <scope>compile</scope>
</dependency>
<dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>2.3</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.7</version>
</dependency>

2.2 极光推送工具类

appkey和master_secert获取教程:http://docs.jiguang.cn/jpush/console/Instructions/

import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

import java.util.Map;

/**
 * 极光推送工具类
 */
public class JpushUtils {

    // 设置好账号的app_key和masterSecret是必须的
    private static String APP_KEY = "XXXX";
    private static String MASTER_SECRET = "XXXX";


    //极光推送>>Android
    //Map<String, String> parm是我自己传过来的参数,可以自定义参数
    public static void jpushAndroid(Map<String, String> 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<String, String> parm是我自己传过来的参数,可以自定义参数
    public static void jpushIOS(Map<String, String> 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<String, String> 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();
        }
    }
}

2.3 推送数据

@RestController
@RequestMapping("jpush")
public class JpushController {

    @RequestMapping("/pushAndroid")
    public JsonData pushMessageToAndroid(){
        //设置推送参数
        //这里可以自定义推送参数了
        Map<String, String> parm = new HashMap<>();
        //设置提示信息,内容是文章标题
        parm.put("msg","胡传磊 回家吃饭了");
        parm.put("title","回家吃饭");
        parm.put("alias","abc");
        JpushUtils.jpushAndroid(parm);

        return JsonData.buildSuccess();
    }
}

如果极光推送没有用户会报错误码:1011
查看教程:http://docs.jiguang.cn/jpush/client/Android/android_3m/

错误码定义
HTTP 返回码为 200 时,是业务相关的错误。

错误码 错误描述
0 调用成功
10 系统内部错误
1001 只支持 HTTP Post 方法,不支持 Get 方法
1002 缺少了必须的参数
1003 参数值不合法
1004 verification_code 验证失败
1005 消息体太大
1007 receiver_value 参数 非法
1008 appkey参数非法
1010 msg_content 不合法
1011 没有满足条件的推送目标
1012 iOS 不支持推送自定义消息。只有 Android 支持推送自定义消息。
1013 content-type 只支持 application/x-www-form-urlencoded
1014 消息内容包含敏感词汇。
1030 内部服务超时。稍后重试。

返回 1011 时:

如果群发:则此应用还没有一个客户端用户注册。请检查 SDK 集成是否正常。

如果是推送给某别名或者标签:则此别名或者标签还没有在任何客户端 SDK 提交设置成功。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!