spring boot>>极光推送(标签或别名)

推送是手机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,需要了解的参考以前文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值