一、使用步骤
目录
1.引入架包
2.创建推送的对象类
3.创建Util类,运行main测试完成
1.引入架包
代码如下(示例):
<!-- 极光推送 begin -->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>test</scope>
</dependency>
<!-- 极光推送 end -->
2.创建推送的对象类
代码如下(示例):
package com.example.demo2.util.jpush;
import lombok.Data;
import java.util.List;
@Data
public class PushStudent {
/** 发送目标类型 **/
private Integer audienceType;
/** 接收消息的用户别名 **/
private String aliasName;
/** 标题 **/
private String title;
/** 内容 **/
private String content;
/** 跳转类型 0:原生 1:网页 **/
private Integer goType;
/** 跳转 pageKey **/
private String pageKey;
/** 推送类型id **/
private Long pushTypeId;
/** 跳转 url **/
private String url;
/** 学生编号 **/
private String studentCode;
/** 发送学生消息id **/
private Long pushStudentId;
/** 发送目标 **/
public enum AudienceTypeEnum {
/** 所有用户 **/
all(0, "所有用户"),
/** 标签用户 **/
tags(1, "标签用户"),
/** 别名用户 **/
alias(2, "别名用户"),
/** 自定义id用户 **/
registrationId(3, "自定义id用户");
private int value;
private String desc;
public int getValue() {
return value;
}
public String getDesc() {
return desc;
}
AudienceTypeEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public static AudienceTypeEnum getTypeByValue(Integer valueKey) {
if (null==valueKey) {
return null;
}
for (AudienceTypeEnum enums : AudienceTypeEnum.values()) {
if (enums.getValue() == valueKey) {
return enums;
}
}
return null;
}
}
}
3.创建Util类,运行main测试完成
代码如下(示例):
package com.example.demo2.util.jpush;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.CIDResult;
import cn.jpush.api.push.PushResult;
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.IosAlert;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 极光推送客户端
*
* @author lhc
* @since 2021-06-01
*/
@Component
@Slf4j
public class MyJPushClientsUtil {
//@Value("${jpush.appKey}")
private String appKey = "";
//@Value("${jpush.masterSecret}")
private String masterSecret = "";
// 此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
@Value("${jpush.apnsProduction}")
private String apnsProduction;
private static JPushClient jPushClient = null;
public JPushClient getJPushClient() {
if (jPushClient == null) {
jPushClient = new JPushClient(masterSecret, appKey);
}
return jPushClient;
}
/** 极光返回的状态码 **/
private static Map<Integer, String> codeMap = new HashMap(12){
private static final long serialVersionUID = 1L;
{
put(200,"OK Success!");
put(400, "错误的请求 该请求是无效的。相应的描述信息会说明原因。");
put(401, "未验证 没有验证信息或者验证失败");
put(403, "被拒绝 理解该请求,但不被接受。相应的描述信息会说明原因。");
put(404, "无法找到 资源不存在,请求的用户的不存在,请求的格式不被支持。");
put(405, "请求方法不合适 该接口不支持该方法的请求。");
put(410, "已下线 请求的资源已下线。请参考相关公告。");
put(429, "过多的请求 请求超出了频率限制。相应的描述信息会解释具体的原因。");
put(500, "内部服务错误 服务器内部出错了。请联系我们尽快解决问题。");
put(502, "无效代理 业务服务器下线了或者正在升级。请稍后重试。");
put(503, "服务暂时失效 服务器无法响应请求。请稍后重试。");
put(504, "代理超时");
}
};
public static String getCodeStr(int code){
return (codeMap.get(code)==null || "".equals(codeMap.get(code)))?"无对应状态码值":codeMap.get(code);
}
/** 获取 cid,避免同一个通知被调用多次 **/
private String getCid(JPushClient jPushClient) {
String value = null;
try {
CIDResult cidResult = jPushClient.getCidList(1, "push");
value = cidResult.cidlist.get(0);
} catch (APIConnectionException | APIRequestException e) {
log.error("获取极光cid失败 ", e);
}
return value;
}
// 扩展消息
private Map<String, String> getAppExtra(PushStudent pushMessage){
Map<String, String> extra = new HashMap<>(6);
extra.put("third_url_encode","false");
extra.put("pageKey",pushMessage.getPageKey());
extra.put("url",pushMessage.getUrl());
extra.put("studentCode",pushMessage.getStudentCode());
extra.put("goType",""+pushMessage.getGoType());
extra.put("pushTypeId",""+pushMessage.getPushTypeId());
return extra;
}
private PushResult sendPush(PushPayload pushPayload) {
log.info("pushPayload={}", pushPayload);
PushResult pushResult = null;
try {
JPushClient jPushClient = this.getJPushClient();
pushResult = jPushClient.sendPush(pushPayload);
log.info("" + pushResult);
if (pushResult.getResponseCode() == 200) {
log.info("push successful, pushPayload={}", pushPayload);
System.out.println(pushPayload);
}
} catch (APIConnectionException e) {
log.error("push failed: pushPayload={}, exception={}", pushPayload, e);
throw new RuntimeException(e.getMessage());
} catch (APIRequestException e) {
log.error("push failed: pushPayload={}, exception={}", pushPayload, e);
throw new RuntimeException(e.getMessage());
}finally {
jPushClient.close();
}
return pushResult;
}
private AndroidNotification getAndroidNotification(PushStudent pushMessage){
return AndroidNotification.newBuilder()
//消息体
.setTitle(pushMessage.getTitle())
.setAlert(pushMessage.getContent())
.addExtras(getAppExtra(pushMessage))
.setBadgeAddNum(1)
.setBadgeClass("com.skyedu.communal.ui.splash.SplashActivity")
.setUriAction("com.skyedu.push.StudentOpenClickActivity")
.setUriActivity("com.skyedu.push.StudentOpenClickActivity")
.build();
}
private IosNotification getIosNotification(PushStudent pushMessage){
IosAlert alert = IosAlert.newBuilder().setTitleAndBody(pushMessage.getTitle(), "", pushMessage.getContent()).build();
return IosNotification.newBuilder()
//消息体
.setAlert(alert)
// 通知提示声音或警告通知
//.setSound(pushMessage.getSound())
// 应用角标
.incrBadge(1)
.addExtras(getAppExtra(pushMessage))
.setMutableContent(true)
.build();
}
/** 发送极光消息 **/
public PushResult buildPush(PushStudent mesVo){
Audience audience;
PushStudent.AudienceTypeEnum audienceTypeEnum = PushStudent.AudienceTypeEnum.getTypeByValue(mesVo.getAudienceType());
switch (audienceTypeEnum) {
case all:
audience = Audience.all();
break;
case tags:
audience = Audience.tag(mesVo.getAliasName());
break;
case alias:
audience = Audience.alias(mesVo.getAliasName());
break;
case registrationId:
audience = Audience.registrationId(mesVo.getAliasName());
break;
default:
log.error("不支持该类型: audience:{} ", mesVo.getAudienceType());
throw new RuntimeException("不支持该类型!");
}
PushPayload.Builder builder = PushPayload.newBuilder();
builder.setPlatform(Platform.android_ios());
builder.setAudience(audience);
// 设置发送设备
Notification.Builder notBuilder = Notification.newBuilder();
notBuilder.addPlatformNotification(getAndroidNotification(mesVo));
notBuilder.addPlatformNotification(getIosNotification(mesVo));
builder.setNotification(notBuilder.build());
// 其他
builder.setCid(getCid(this.getJPushClient()));
builder.setOptions(Options.newBuilder()
.setApnsProduction(apnsProduction!=null && apnsProduction.equals("true"))
.setThirdPartyChannelV2(getThirdPartyChannel()).build());
PushResult pushResult = this.sendPush(builder.build());
return pushResult;
}
public Map getThirdPartyChannel(){
Map<String, JsonObject> thirdPartyChannel = new HashMap<>();
JsonObject json = new JsonObject();
json.addProperty("distribution","secondary_push");
thirdPartyChannel.put("xiaomi",json);
thirdPartyChannel.put("huawei",json);
thirdPartyChannel.put("meizu",json);
thirdPartyChannel.put("fcm",json);
thirdPartyChannel.put("oppo",json);
thirdPartyChannel.put("vivo",json);
return thirdPartyChannel;
}
public static void main(String[] args) throws APIConnectionException {
MyJPushClientsUtil jPushUtil = new MyJPushClientsUtil();
PushStudent mesVo = new PushStudent();
mesVo.setAudienceType(PushStudent.AudienceTypeEnum.alias.getValue());
List<String> aliasList = Arrays.asList();
mesVo.setAliasName("你的别名");
mesVo.setTitle("消息标题");
mesVo.setContent("消息内容消息内容消息内容");
mesVo.setPageKey("pagekey");
mesVo.setUrl("https://fanyi.baidu.com/?aldtype=16047#auto/zh");
mesVo.setStudentCode("NO110");
PushResult pushResult = jPushUtil.buildPush(mesVo);
System.out.println(pushResult.getOriginalContent());
}
}