推送是手机APP必不可少的一样功能,这次项目有需要,记录一下java后台实现
一、maven导入jar包
<!-- 极光推送 -->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.24.Final</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- 极光推送 -->
二、创建util
package com.baojian.zhang.util;
import java.util.HashSet;
import java.util.Set;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.model.PushPayload;
/**
*
* 功能:极光推送<br>
* 作者:张tt<br>
* 时间:2018年7月16日<br>
* 版本:1.0<br>
*
*/
@Service
public class JPushService {
@Value("${jpush.app.key}")
private String jpushAppKey;
@Value("${jpush.master.secret}")
private String jpushMasterSecret;
/**
* 创建 基础 JPushClient
* @return
*/
private JPushClient getJPushClient() {
return new JPushClient(jpushMasterSecret, jpushAppKey);
}
/**
* 注销pushid绑定的tag和alias
*
* @param pushId
* 极光的推送编号
* @throws APIRequestException
* @throws APIConnectionException
*/
public void logout(String pushId) throws APIConnectionException, APIRequestException {
getJPushClient().updateDeviceTagAlias(pushId, true, true);
}
/**
* 更新用户tags和alias
* @param pushId
* 推送push编号
* @param cardNumber
* 用户卡号
* @param tagsToAdd
* 用户标签
* @throws APIConnectionException
* @throws APIRequestException
*/
public void updateTagAlias(String pushId, String cardNumber, Set<String> tagsToAdd)
throws APIConnectionException, APIRequestException {
getJPushClient().updateDeviceTagAlias(pushId, cardNumber, tagsToAdd,
new HashSet<>(getJPushClient().getDeviceTagAlias(pushId).tags));
}
/**
* 进行推送
* @param build
* @throws APIConnectionException
* @throws APIRequestException
*/
public void sendPush(PushPayload build) throws APIConnectionException, APIRequestException {
getJPushClient().sendPush(build);
}
}
三、进行推送测试
@RequestMapping(value = "/pushArticleToUser", method = RequestMethod.POST)
@ApiOperation(value = "推送公告给用户")
public BaseVO<Void> pushArticleToUser(
@RequestParam(value = "cardNumber", required = true) @ApiParam(name = "cardNumber", value = "用户卡号", required = true) String cardNumber,
@RequestParam(value = "pushId", required = true) @ApiParam(name = "pushId", value = "推送编号", required = true) String pushId,
@RequestParam(value = "platform", required = true) @ApiParam(name = "platform", value = "推送平台(1: all,2: android, 3: ios)", required = true) Integer platform,
@RequestParam(value = "audienceType", required = true) @ApiParam(name = "audienceType", value = "推送目标类型,(1表示全部,2表示按tag推送,3表示按卡号推送)", required = true) Integer audienceType,
@RequestParam(value = "tags", required = false, defaultValue = "") @ApiParam(name = "tags", value = "推送标签,audienceType为2时传入,多个用逗号分开(,)", required = false, defaultValue = "") String tags,
@RequestParam(value = "alias", required = false, defaultValue = "") @ApiParam(name = "alias", value = "推送别名,audienceType为3时传入,多个用逗号分开(,)", required = false, defaultValue = "") String alias,
@RequestParam(value = "title", required = true) @ApiParam(name = "title", value = "推送标题", required = true) String title,
@RequestParam(value = "secret", required = true) @ApiParam(name = "secret", value = "极光推送密码", required = true) String secret){
// 根据用户卡号和标签设置极光tag和alias。这一步应该在用户登录时完成
if (StringUtils.isNotBlank(cardNumber)) {
// 设置tag和alias 例如:地区、会员级职
Set<String> tagsToAdd = new HashSet<String>();
tagsToAdd.add("北京");
tagsToAdd.add("6");
try {
jPushService.updateTagAlias(pushId, cardNumber, tagsToAdd);
} catch (APIConnectionException | APIRequestException e) {
e.printStackTrace();
return new BaseVO<Void>(11, "用户绑定标签错误!");
}
}
// 当用户退出登录时,注销pushid绑定的tag和alias
//try {
// jPushService.logout(pushId);
//} catch (APIConnectionException | APIRequestException e1) {
// e1.printStackTrace();
//}
// 防止恶意调用推送
if (!jpushMasterSecret.equals(secret)) {
return new BaseVO<Void>(2, "推送失败,secret参数错误!");
}
Builder builder = PushPayload.newBuilder();
// 判断推送平台
switch (platform) {
case 1:
// 全部
builder.setPlatform(Platform.all());
break;
case 2:
// android
builder.setPlatform(Platform.android());
break;
case 3:
// ios
builder.setPlatform(Platform.ios());
break;
default:
break;
}
// 判断推送目标
switch (audienceType) {
case 1:
// 全部
builder.setAudience(Audience.all());
break;
case 2:
// tags
if (StringUtils.isBlank(tags)) {
return new BaseVO<Void>(2, "推送目标为2,按标签推送时,tags参数不能为空!");
}
builder.setAudience(Audience.tag(StringUtils.split(tags, ',')));
break;
case 3:
// 卡号
if (StringUtils.isBlank(alias)) {
return new BaseVO<Void>(2, "推送目标为3,按别名推送时,alias参数不能为空!");
}
builder.setAudience(Audience.alias(StringUtils.split(alias, ",")));
break;
default:
break;
}
// 设置推送标题
builder.setNotification(Notification.alert(title));
// 设置推送内容
builder.setMessage(Message.content("公告"));
// 推送
try {
jPushService.sendPush(builder.build());
return new BaseVO<Void>(1, "推送成功!");
} catch (APIConnectionException | APIRequestException e) {
e.printStackTrace();
return new BaseVO<Void>(11, "推送失败!");
}
}
注:接口测试采用swagger,需要了解的参考以前文章