一、引入jar包
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.1.7</version>
</dependency>
二、工具类
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.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 com.alibaba.fastjson.JSONArray;
import com.google.gson.JsonObject;
import com.gxkj.common.core.util.DataSyncUtils;
import com.gxkj.common.modular.system.model.SystemUser;
import jodd.util.StringUtil;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
/**
* @description: 极光推送工具类
*/
public class JpushUtils {
// 极光推送官网注册后的key
private static String appKey = "1991614a4c14b8bcbf062cce";
// 极光推送官网注册后的Secret
private static String masterSecret = "2033a9e112c577c9e2c71d28";
private static JPushClient jPushClient = new JPushClient(masterSecret, appKey);
/**
* @desc: 批量推送
* platForm: android/ios
* pattern: 根据alias(根据别名)/registrationId(设备id)推送 / 全局推送(推所有用户)
* title 标题
* alert 内容
* alias 别名
* registrationIds 设备Id
* key 拓展字段key值
* value 拓展字段value
* indent:是否点击消息推送打开到指定的页面
**/
public static Long jiguangSend_batch( String platForm,
String pattern,
String title,
String alert,
String[] alias,
String[] registrationIds,
String key,
String value,
String indent) {
PushResult pushResult = null;
try {
NotificationBO notificationBO = new NotificationBO();
notificationBO.setTitle(title);
notificationBO.setAlert(alert);
JsonObject jsonObject = new JsonObject();
if(StringUtil.isNotEmpty(indent)){
jsonObject.addProperty("url",indent);
}else{
jsonObject.addProperty("url","");
}
PushPayload pushPayload = JpushUtils.pushBatch(notificationBO, alias, registrationIds, platForm, pattern, key, value, jsonObject);
System.out.println(pushPayload);
pushResult = jPushClient.sendPush(pushPayload);
System.out.println(pushResult);
if (pushResult.getResponseCode() == 200) {
return pushResult.msg_id;
}
} catch (APIConnectionException | APIRequestException e) {
e.printStackTrace();
}
return null;
}
/**
* @desc: 设置别名
* alias: 别名
* registrationIds: 注册Id
**/
public static void setAlias(String registrationIds, String alias) {
HashSet<String> tagsToAdd = new HashSet<>();
HashSet<String> tagsToRemove = new HashSet<>();
try {
jPushClient.updateDeviceTagAlias(registrationIds, alias, tagsToAdd, tagsToRemove);
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
/**
* @desc: 指定平台批量推送
* notificationBO: 消息
* alias: 别名
* registrationIds: 注册Id
* platForm: android/ios
* pattern: 根据alias/registrationIds推送 / 全局推送(推所有用户)
* key 拓展字段key值
* value 拓展字段value
**/
private static PushPayload pushBatch(NotificationBO notificationBO, String[] alias, String[] registrationIds, String platForm, String pattern, String key, String value, JsonObject indent) {
// 创建一个IosAlert对象,可指定APNs的alert、title等字段
return PushPayload.newBuilder()
// 指定要推送的平台
.setPlatform(platForm.equals(PushEnum.Android.getContent()) ? Platform.android()
: platForm.equals(PushEnum.IOS.getContent()) ? Platform.ios() : Platform.all())
// 指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration
.setAudience(pattern.equals(PushEnum.Alias.getContent()) ? Audience.alias(alias) :
pattern.equals(PushEnum.RegistrationId.getContent()) ? Audience.registrationId(registrationIds) :
Audience.all())
// jpush的通知
.setNotification(cn.jpush.api.push.model.notification.Notification.newBuilder()
// 指定当前推送的通知
.addPlatformNotification(platForm.equals(PushEnum.Android.getContent()) ? AndroidNotification.newBuilder().
setAlert(notificationBO.getAlert())
.setTitle(notificationBO.getTitle())
.setIntent(indent)
.addExtra(key,value)
.build() :
IosNotification.newBuilder().setThreadId(notificationBO.getTitle()).setAlert(notificationBO.getAlert()).build())
.build())
.setOptions(Options.newBuilder()
// 此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
.setApnsProduction(false)
// 此字段是给开发者自己给推送编号,方便推送者分辨推送记录
.setSendno(1)
// 此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
.setTimeToLive(86400)
.build())
.build();
}
/**
* @desc: 删除别名
* alias: 别名
**/
public static void delAlias(String alias) {
try {
jPushClient.deleteAlias(alias,null);
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
/**
* 请求极光推送的接口以用来取消推送(DELETE)请求
* @Param msgId 需要取消的推送id
*/
public static void auroraPush (Long msgId) {
// 设置key 推荐从springBean中获取,或者配置静态类
String appKey = JpushUtils.appKey;
String masterKey = JpushUtils.masterSecret;
String url = "https://api.jpush.cn/v3/push/" + msgId;
CloseableHttpResponse response = null;
CloseableHttpClient httpClient = null;
String responseContent = "";
try {
httpClient = HttpClients.createDefault();
HttpDelete httpDelete = new HttpDelete(url);
httpDelete.addHeader("Accept","application/json");
// 设置请求标头
httpDelete.addHeader("Content-Type", "text/plain");
httpDelete.addHeader("Authorization", "Basic " + Base64.getUrlEncoder()
.encodeToString((appKey+ ":" + masterKey).getBytes()));
response = httpClient.execute(httpDelete);
// 接收返回的数据
HttpEntity entity = response.getEntity();
responseContent = EntityUtils.toString(entity, "UTF-8");
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
log.error(responseContent);
} finally {
close(response, httpClient);
}
}
}
三、示例
// 通知司机
// 使用极光推送通知司机
// 获取别名(别名要注册到极光推送平台,可调用工具类中的设置别名接口)
String[] alias = {item.getCode()};
// 获取设备ID(设备ID既手机设备ID,由APP发送过来保存)
SystemUser user = userMapper.selectOne(new QueryWrapper<SystemUser>()
.lambda()
.eq(SystemUser::getUsername, item.getCode()));
String[] registrationIds = {user.getRegistrationId()};
String alert = "位置" + item.getLocation() + "的拖车订单已经三分钟还未有人接单!";
//推送平台为android,推送方式为使用别名推送
// JpushUtils.jiguangSend_batch(DataSyncUtils.android, DataSyncUtils.registrationIds, DataSyncUtils.awaitOrder, alert, alias, registrationIds, DataSyncUtils.trafficTrailerId, item.getId());
// JpushUtils.jiguangSend_batch(DataSyncUtils.android, DataSyncUtils.registrationIds, DataSyncUtils.awaitOrder, alert, alias, registrationIds, null, null);
JpushUtils.jiguangSend_batch("android", "registrationId", "测试", alert, alias, registrationIds, null, null,"");
撤回发起的推送
String msgId = stringRedisTemplate.opsForValue().get(trailerOrderInfo.getId());
if(StringUtil.isNotEmpty(msgId)) {
JpushUtils.auroraPush(Long.valueOf(msgId));
stringRedisTemplate.delete(trailerOrderInfo.getId());
}
注:stringRedisTemplate.opsForValue().get(trailerOrderInfo.getId()); 这段代码是为了拿到存在redis上的msgId(上面示例中的方法有返回),可自行修改写法
**注:**首先要先到极光推送官网注册一个账号,这样才能获取到上面说的appKey以及masterSecret ,第二既是注册别名(可以是用户账号)以及设备ID(这个由APP提供)