极光推送,其实就是依赖第三方平台推送消息,匹配多端推送,可以支持的设备有Android、ios、winphone,单靠这样说我们还是无法知道他能做什么,我们先来看个小例子。

一、首先注册极光服务账号,登录后进入应用设置,记录AppKey和Master Secret,java后台开发者要用到。

二、点击“推送设置”:

设置Android和iOS:

Android应用包名自己定义,下载demo,Android开发人员查看集成指南,将sdk集成到项目中。

android 推送铃声设置 安卓怎么设置推送_极光推送


iOS应用包名自己定义,下载demo,iOS开发人员查看集成指南,将sdk集成到项目中。

android 推送铃声设置 安卓怎么设置推送_ios_02


三、Android和iOS分别在自己的业务内调用java提供的后台接口:用户和极光id绑定接口。

绑定成功后发送通知,模拟发一条通知:预估人数是1,这是极光后台返回的值。

android 推送铃声设置 安卓怎么设置推送_ios_03


四、发送后显示推送历史:

android 推送铃声设置 安卓怎么设置推送_ios_04


五、以上是模拟在极光开发者服务推送消息的过程。

该过程没有问题的话,我们java就可以开始爽爽的开发接口了。拼接极光推送所需的json数据,调用接口推送就可以。

六、java核心代码:

一、绑定接口开发:

绑定员工与极光id,我们是需要推给门店下所有登录门店的员工的所有手机(Android和iOS)。

这里有个麻烦的地方,就是每次移动端重装app,极光id都可能会变化,这样绑定的时候我不能确定是同一设备生成了不同极光id,还是不同设备生成了新的极光id,所以我采用的方法就是将这些id都绑定,但是线上会产生很多脏数据,不知道大牛们都怎么处理的。

二、走自己业务逻辑
三、拼接极光推送所需json:

/**
     * 组装极光推送专用json串
     * @param alert
     * @param registrationId
     * @return json
     */
    private JSONObject generateJson(String alert, List<String> registrationId,Map<String,Object> android_extras,Map<String,Object> ios_extras){
        JSONObject json = new JSONObject();
        JSONArray platform = new JSONArray();//平台
        platform.add("android");
        platform.add("ios");

        JSONObject audience = new JSONObject();//推送目标
        audience.put("registration_id", registrationId);

        JSONObject notification = new JSONObject();//通知内容
        JSONObject android = new JSONObject();//android通知内容
        android.put("alert", alert);
        android.put("extras", android_extras);//android额外参数

        JSONObject ios = new JSONObject();//ios通知内容
        ios.put("alert", alert);
        ios.put("sound", "default");
        ios.put("extras", ios_extras);//ios额外参数
        notification.put("android", android);
        notification.put("ios", ios);

        JSONObject options = new JSONObject();//设置参数
        options.put("time_to_live", Integer.valueOf(time_to_live));
        options.put("apns_production", apns_production);

        json.put("platform", platform);
        json.put("audience", audience);
        json.put("notification", notification);
        json.put("options", options);
        return json;

    }

推送:

@Value("${jiguang.appKey}")
    private String appKey;                         //极光appKey
    @Value("${jiguang.masterSecret}")
    private String masterSecret;                   //极光secret
    @Value("${jiguang.pushUrl}")
    private String pushUrl;                        //极光推送接口url
    @Value("${jiguang.apns_production}")
    private String apns_production;                //推送环境参数,设置true表示推送生产环境,false表示开发;默认推送生产环境
    @Value("${jiguang.time_to_live}")
    private String time_to_live;                   //离线消息保留时长,默认保留86400(1天),最长 10 天。设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到。

    @Override
    public ApiResponse jiGuangPush(JpushRequestModel jpushRequestModel) {
        //构建极光推送所需json
        log.info("极光推送带参:{}",jpushRequestModel);
        JSONObject object = generateJson(jpushRequestModel.getAlert(),jpushRequestModel.getRegistrationId(),jpushRequestModel.getAndroid_extras(),jpushRequestModel.getIos_extras());
        String data = object.toJSONString();
        log.info("-------极光推送构建的json消息:{}",data);

        //1.推送消息
        log.info("---------appKey:{},---------masterSecret:{}",appKey,masterSecret);
        String base64_auth_string = encryptBASE64(appKey + ":" + masterSecret);
        String authorization = "Basic " + base64_auth_string;
        log.info("Authorization值是:{}",authorization);
        HttpPost httpPost = new HttpPost(pushUrl);
        CloseableHttpClient client = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String result = "";
        Map<String,Object> map = new HashMap<>();
        try {
            StringEntity entity = new StringEntity(data, "UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            httpPost.setHeader("Authorization",authorization.trim());
            log.info("--------开始调用极光推送push-----");
            response = client.execute(httpPost);
            result = EntityUtils.toString(response.getEntity(), "UTF-8");
            log.info("--------push消息执行完毕-----,结果:{}",result);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if(jsonObject.containsKey("error")){
                log.info("针对极光id为" + model.getAudience().getRegistration_id() + "的信息推送失败!");
                JSONObject error = JSONObject.parseObject(JSONObject.toJSONString(jsonObject.get("error")));
                log.info("错误信息为:" + error.get("message").toString());
                log.info("针对极光id为" + model.getAudience().getRegistration_id() + "的信息推送失败!");
                map.put("error",error);
            }else {
                log.info("----------极光推送成功!!!!!");
                map.put("sendno",jsonObject.get("sendno"));
                map.put("msg_id",jsonObject.get("msg_id"));
            }
        } catch (Exception e) {
            log.error("请求接口时偶遇异常,堆栈轨迹如下", e);
        }
        finally{
            if(response != null){
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(client != null){
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return ApiResponse.builder().setData(map);
    }

    /**
   * BASE64加密工具
   */
    public static String encryptBASE64(String str) {
        byte[] key = str.getBytes();
        BASE64Encoder base64Encoder = new BASE64Encoder();
        String strs = base64Encoder.encodeBuffer(key);
        return strs;
    }

总结:

  • 官方文档是个很好的学习工具,我主要给大家分享的是使用方式,欢迎大家拍砖!
  • 写接口,不是实现了就好的,我们还应该考虑自己的接口是否好用,好用体现在别人复用的时候,可以很容易实现。(我们的代码需要不断优化)
  • 移动端开发者千万注意:生产环境要传生产环境的证书,打生产环境的包
  • 极光推送本身也是不稳定的,在极光服务平台测试发通知时,获取的预估人数对不上也时常发生,也不用急,用任何一家软件,都不能保证100%满足用户需求,只能从多家同类软件中对比,选择适合自己的就可以。