文章目录
1.maven依赖
<!--极光推送-->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.2.9</version>
</dependency>
2.设置config
import cn.jpush.api.JPushClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* @authorcxl
* @desc 极光配置类
* @date 2019年4月17日15:52:14
*
*/
@Configuration
@ConfigurationProperties
public class JiGuangConfig {
/**
* 极光官网-个人管理中心-appkey
* https://www.jiguang.cn/
*/
@Value("${push.appkey}")
private String appkey;
/**
* 极光官网-个人管理中心-点击查看-secret
*/
@Value("${push.secret}")
private String secret;
/***
* yml配置案例:
* push:
* appkey: ed8a79344a04217ee343xxxx
* secret: e2a54e1432bcc7eaee64xxxx
*/
private JPushClient jPushClient;
/**
* 推送客户端
* @return
*/
@PostConstruct
public void initJPushClient() {
jPushClient = new JPushClient(secret, appkey);
}
/**
* 获取推送客户端
* @return
*/
public JPushClient getJPushClient() {
return jPushClient;
}
}
在里面设置appKey和SecretKey
3.推送信息实体
/**
* @author cxl
* @date 2019年4月17日15:48:37
* @desc 极光推送信息实体
*/
@Data
public class PushBean {
// 必填, 通知内容, 内容可以为空字符串,则表示不展示到通知栏。
private String alert;
// 可选, 附加信息, 供业务使用。
private Map<String, String> extras;
//android专用// 可选, 通知标题 如果指定了,则通知里原来展示 App名称的地方,将展示成这个字段。
private String title;
}
4.两个Service
为了更融合实际业务需求,这里已 接口-impl
接口
/**
* 极光推送
* 封装第三方api相关
* @author cxl
*/
public interface MyJiGuangPushService {
boolean pushAll(PushBean pushBean);
boolean pushIos(PushBean pushBean);
boolean pushIos(PushBean pushBean, String... registids);
boolean pushAndroid(PushBean pushBean);
boolean pushAndroid(PushBean pushBean, String... registids);
boolean sendPush(PushPayload pushPayload);
}
//====================================================================
/**
* 推送服务
* 封装业务功能相关
* @author cxl
*/
public interface JiGuangPushService{
boolean pushAll(PushBean pushBean);
boolean pushIos(PushBean pushBean);
boolean pushIos(PushBean pushBean, String... registids);
boolean pushAndroid(PushBean pushBean);
boolean pushAndroid(PushBean pushBean, String... registids);
String[] checkRegistids(String[] registids);
}
实现类
JiGuangPushService 的实现类
/**
* 推送服务
* 封装业务功能相关
* @author cxl
*/
@Service
public class JiGuangPushServiceImpl implements JiGuangPushService {
/** 一次推送最大数量 (极光限制1000) */
private static final int max_size = 800;
@Autowired
private MyJiGuangPushService jPushService;
/**
* 推送全部, 不支持附加信息
* @return
*/
@Override
public boolean pushAll(PushBean pushBean){
return jPushService.pushAll(pushBean);
}
/**
* 推送全部ios
* @return
*/
@Override
public boolean pushIos(PushBean pushBean){
return jPushService.pushIos(pushBean);
}
/**
* 推送ios 指定id
* @return
*/
@Override
public boolean pushIos(PushBean pushBean, String... registids){
registids = checkRegistids(registids); // 剔除无效registed
while (registids.length > max_size) { // 每次推送max_size个
jPushService.pushIos(pushBean, Arrays.copyOfRange(registids, 0, max_size));
registids = Arrays.copyOfRange(registids, max_size, registids.length);
}
return jPushService.pushIos(pushBean, registids);
}
/**
* 推送全部android
* @return
*/
@Override
public boolean pushAndroid(PushBean pushBean){
return jPushService.pushAndroid(pushBean);
}
/**
* 推送android 指定id
* @return
*/
@Override
public boolean pushAndroid(PushBean pushBean, String... registids){
registids = checkRegistids(registids); // 剔除无效registed
while (registids.length > max_size) { // 每次推送max_size个
jPushService.pushAndroid(pushBean, Arrays.copyOfRange(registids, 0, max_size));
registids = Arrays.copyOfRange(registids, max_size, registids.length);
}
return jPushService.pushAndroid(pushBean, registids);
}
/**
* 剔除无效registed
* @param registids
* @return
*/
@Override
public String[] checkRegistids(String[] registids) {
List<String> regList = new ArrayList<String>(registids.length);
for (String registid : registids) {
if (registid!=null && !"".equals(registid.trim())) {
regList.add(registid);
}
}
return regList.toArray(new String[0]);
}
}
MyJiGuangPushService 实现类
/**
* 极光推送
* 封装第三方api相关
* @author cxl
*/
@Service
@Slf4j
public class MyJiGuangPushServiceImpl implements MyJiGuangPushService {
@Autowired
private JiGuangConfig jPushConfig;
/**
* 广播 (所有平台,所有设备, 不支持附加信息)
* @param pushBean 推送内容
* @return
*/
@Override
public boolean pushAll(PushBean pushBean){
return sendPush(PushPayload.newBuilder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setNotification(Notification.alert(pushBean.getAlert()))
.build());
}
/**
* ios广播
* @param pushBean 推送内容
* @return
*/
@Override
public boolean pushIos(PushBean pushBean){
return sendPush(PushPayload.newBuilder()
.setPlatform(Platform.ios())
.setAudience(Audience.all())
.setNotification(Notification.ios(pushBean.getAlert(), pushBean.getExtras()))
.build());
}
/**
* ios通过registid推送 (一次推送最多 1000 个)
* @param pushBean 推送内容
* @param registids 推送id
* @return
*/
@Override
public boolean pushIos(PushBean pushBean, String... registids){
return sendPush(PushPayload.newBuilder()
.setPlatform(Platform.ios())
.setAudience(Audience.registrationId(registids))
.setNotification(Notification.ios(pushBean.getAlert(), pushBean.getExtras()))
.build());
}
/**
* android广播
* @param pushBean 推送内容
* @return
*/
@Override
public boolean pushAndroid(PushBean pushBean){
return sendPush(PushPayload.newBuilder()
.setPlatform(Platform.android())
.setAudience(Audience.all())
.setNotification(Notification.android(pushBean.getAlert(), pushBean.getTitle(), pushBean.getExtras()))
.build());
}
/**
* android通过registid推送 (一次推送最多 1000 个)
* @param pushBean 推送内容
* @param registids 推送id
* @return
*/
@Override
public boolean pushAndroid(PushBean pushBean, String ... registids){
return sendPush(PushPayload.newBuilder()
.setPlatform(Platform.android())
.setAudience(Audience.registrationId(registids))
.setNotification(Notification.android(pushBean.getAlert(), pushBean.getTitle(), pushBean.getExtras()))
.build());
}
/**
* 调用api推送
* @param pushPayload 推送实体
* @return
*/
@Override
public boolean sendPush(PushPayload pushPayload){
log.info("发送极光推送请求: {}", pushPayload);
PushResult result = null;
try{
result = jPushConfig.getJPushClient().sendPush(pushPayload);
} catch (APIConnectionException e) {
log.error("极光推送连接异常: ", e);
} catch (APIRequestException e) {
log.error("极光推送请求异常: ", e);
}
if (result!=null && result.isResultOK()) {
log.info("极光推送请求成功: {}", result);
return true;
}else {
log.info("极光推送请求失败: {}", result);
return false;
}
}
}
5.注册应用
1.应用创建
1.添加应用
进入极光个人中心
填写基本信息
创建好了
2.查看Appkey和SecretKey
3.创建一个安卓应用
点击填写包名
然后点击保存
一个应用只能改一次
出现二维码了,我们扫描下,然后拿出手机
4.DemoApp安装
这个是默认打开的页面
接着,要点击GET_REGISTRATION_ID
按钮
使他生成RegId
该RegId
是用户第一次在线注册该程序生成的唯一ID,每次进入程序就会重新生成一个新的
到这里,安卓demo的app就安装完成,下面就开始测试阶段!
6.测试推送
我这里就只测试了安卓,这里别忘记修改yml
配置文件里面的key
配置
@Autowired
private JiGuangPushService service;
1.广播推送
广播推送也就是只要是拥有该appKey
下载的安装程序的用户,都会受到信息
/**
* 广播
* @param title
* @param content
* @return
*/
@GetMapping("go/{title}/{content}")
public boolean test(@PathVariable("title")String title,
@PathVariable("content")String content){
PushBean pushBean = new PushBean();
pushBean.setTitle(title);
pushBean.setAlert(content);
boolean flag = service.pushAndroid(pushBean);
return flag;
}
发送请求
在手机上查看
发现有了推送信息
点击进去查看
广播推送就完成了
2.单独对regId去做推送
根据之前的步骤,我们知道了regId(设备对应的唯一极光ID)
/**
* 单独对(多个)regId进行推送
* @param title
* @param regId
* @param content
* @return
*/
@GetMapping("go/{regId}/{title}/{content}")
public boolean test(@PathVariable("title")String title,
@PathVariable("regId")String regId,
@PathVariable("content")String content){
PushBean pushBean = new PushBean();
pushBean.setTitle(title);
pushBean.setAlert(content);
boolean flag = service.pushAndroid(pushBean, regId);
return flag;
}
发送请求
返回true,打开手机查看
点击进去查看
推送IOS也一样的这里就不做演示了,本人亲测可用!