极光推送,其实就是依赖第三方平台推送消息,匹配多端推送,可以支持的设备有Android、ios、winphone,单靠这样说我们还是无法知道他能做什么,我们先来看个小例子。
一、首先注册极光服务账号,登录后进入应用设置,记录AppKey和Master Secret,java后台开发者要用到。
二、点击“推送设置”:
设置Android和iOS:
Android应用包名自己定义,下载demo,Android开发人员查看集成指南,将sdk集成到项目中。
iOS应用包名自己定义,下载demo,iOS开发人员查看集成指南,将sdk集成到项目中。
三、Android和iOS分别在自己的业务内调用java提供的后台接口:用户和极光id绑定接口。
绑定成功后发送通知,模拟发一条通知:预估人数是1,这是极光后台返回的值。
四、发送后显示推送历史:
五、以上是模拟在极光开发者服务推送消息的过程。
该过程没有问题的话,我们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%满足用户需求,只能从多家同类软件中对比,选择适合自己的就可以。