1.由于项目的需求,需要在Android APP上实现消息推送功能,所以引用了极光推送(官网:https://www.jiguang.cn/,  文档:http://docs.jiguang.cn/)

2.极光推送是经过考验的大规模app推送平台,极光推送目前每天推送消息数超过20亿条。 开发者集成SDK后,可以通过调用API推送消息。同时,极光推送提供可视化的web端控制台发送通知,统计分析推送效果。 极光推送全面支持 Android, iOS, Winphone 三大手机平台。

3.要在自己项目集成极光推送功能,首先需要在逛网注册一个极光账号,获取AppKey和masterSecret


4.项目集成java SDK,导入maven依赖

    <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> <!--以上部分为极光推送所依赖的jar包-->

5.application.yml需要添加的配置

jpush:
appKey: 81a89169e875c793c1e1d862
masterSecret: 630c4f475810e7426f065b14
liveTime: 1000
apnsProduction: false # 是否生成环境,true表示生成环境

6.创建极光推送基本配置信息

@Component("jpushConfig")
public class JpushConfig { /**
* 极光推送的用户名
*/
@Value("${jpush.appKey}")
private String appkey;
/**
* 极光推送的密码
*/
@Value("${jpush.masterSecret}")
private String masterSecret;
/**
* 极光推送设置过期时间
*/
@Value("${jpush.liveTime}")
private String liveTime; public String getAppkey() {
return appkey;
} public void setAppkey(String appkey) {
this.appkey = appkey;
} public String getMasterSecret() {
return masterSecret;
} public void setMasterSecret(String masterSecret) {
this.masterSecret = masterSecret;
} public String getLiveTime() {
return liveTime;
} public void setLiveTime(String liveTime) {
this.liveTime = liveTime;
}

7.编写极光推送工具类

@Service("jpushService")
@Slf4j
public class JpushUtils { @Resource
JpushConfig jpushConfig; /**
* 发送自定义消息,由APP端拦截信息后再决定是否创建通知(目前APP用此种方式)
*
* @param title App通知栏标题
* @param content App通知栏内容(为了单行显示全,尽量保持在22个汉字以下)
* @param extrasMap 额外推送信息(不会显示在通知栏,传递数据用)
* @param alias 别名数组,设定哪些用户手机能接收信息(为空则所有用户都推送)
* @return PushResult
*/
public PushResult sendCustomPush(String title, String content, Map<String, String> extrasMap, String... alias) throws APIConnectionException, APIRequestException {
ClientConfig clientConfig = ClientConfig.getInstance();
clientConfig.setTimeToLive(Long.parseLong(jpushConfig.getLiveTime()));
// 使用NativeHttpClient网络客户端,连接网络的方式,不提供回调函数
JPushClient jpushClient = new JPushClient(jpushConfig.getMasterSecret(), jpushConfig.getAppkey(), null,
clientConfig);
// 设置为消息推送方式为仅推送消息,不创建通知栏提醒
// PushPayload payload = buildCustomPushPayload(title, content, extrasMap, alias);
PushPayload payload = buildCustomPushPayload(title, content, extrasMap, alias);
PushResult result = jpushClient.sendPush(payload);
return result;
} /**
* 发送通知消息
*
* @param title App通知栏标题
* @param content App通知栏内容(为了单行显示全,尽量保持在22个汉字以下)
* @param extrasMap 额外推送信息(不会显示在通知栏,传递数据用)
* @param tags 标签数组,设定哪些用户手机能接收信息(为空则所有用户都推送)
*/
public PushResult sendPush(String title, String content, Map<String, String> extrasMap, String... tags) throws APIConnectionException, APIRequestException {
ClientConfig clientConfig = ClientConfig.getInstance();
clientConfig.setTimeToLive(Long.valueOf(jpushConfig.getLiveTime()));
// 使用NativeHttpClient网络客户端,连接网络的方式,不提供回调函数
JPushClient jpushClient = new JPushClient(jpushConfig.getMasterSecret(), jpushConfig.getAppkey(), null,
clientConfig);
// 设置推送方式
PushPayload payload = buildPushLoadByTags(title, content, extrasMap, tags);
PushResult result = jpushClient.sendPush(payload);
return result;
} /**
* 异步请求推送方式
* 使用NettyHttpClient,异步接口发送请求,通过回调函数可以获取推送成功与否情况
*
* @param title 通知栏标题
* @param content 通知栏内容(为了单行显示全,尽量保持在22个汉字以下)
* @param extrasMap 额外推送信息(不会显示在通知栏,传递数据用)
* @param alias 需接收的用户别名数组(为空则所有用户都推送)
*/
public void sendPushWithCallback(String title, String content, Map<String, String> extrasMap, String... alias) {
ClientConfig clientConfig = ClientConfig.getInstance();
clientConfig.setTimeToLive(Long.valueOf(jpushConfig.getLiveTime()));
String host = (String) clientConfig.get(ClientConfig.PUSH_HOST_NAME);
NettyHttpClient client = new NettyHttpClient(
ServiceHelper.getBasicAuthorization(jpushConfig.getAppkey(), jpushConfig.getMasterSecret()), null,
clientConfig);
try {
URI uri = new URI(host + clientConfig.get(ClientConfig.PUSH_PATH));
PushPayload payload = buildPushPayload(title, content, extrasMap, alias);
client.sendRequest(HttpMethod.POST, payload.toString(), uri, new NettyHttpClient.BaseCallback() {
@Override
public void onSucceed(ResponseWrapper responseWrapper) {
if (200 == responseWrapper.responseCode) {
log.info("极光推送成功");
} else {
log.info("极光推送失败,返回结果: " + responseWrapper.responseContent);
}
}
});
} catch (URISyntaxException e) {
e.printStackTrace();
} finally {
// 需要手动关闭Netty请求进程,否则会一直保留
client.close();
} } /**
* 设置、更新、设备的 tag, alias 信息。
*
* @param registrationId 设备的registrationId
* @param alias 更新设备的别名属性
* @param tagsToAdd 添加设备的tag属性
* @param tagsToRemove 移除设备的tag属性
*/
public void UpdateDeviceTagAlias(String registrationId, String alias, Set<String> tagsToAdd, Set<String> tagsToRemove) throws APIConnectionException, APIRequestException {
JPushClient jpushClient = new JPushClient(jpushConfig.getMasterSecret(), jpushConfig.getAppkey());
jpushClient.updateDeviceTagAlias(registrationId, alias, tagsToAdd, tagsToRemove);
} /**
* 构建Android和IOS的推送通知对象
*
* @return PushPayload
*/
private PushPayload buildPushPayload(String title, String content, Map<String, String> extrasMap, String... alias) {
if (extrasMap == null || extrasMap.isEmpty()) {
extrasMap = new HashMap<String, String>();
}
// 批量删除数组中空元素
String[] newAlias = removeArrayEmptyElement(alias);
return PushPayload.newBuilder().setPlatform(Platform.android_ios())
// 别名为空,全员推送;别名不为空,按别名推送
.setAudience((null == newAlias || newAlias.length == 0) ? Audience.all() : Audience.alias(alias))
// .setAudience(Audience.registrationId("d"))
.setNotification(Notification.newBuilder().setAlert(content)
.addPlatformNotification(
AndroidNotification.newBuilder().setTitle(title).addExtras(extrasMap).build())
.addPlatformNotification(IosNotification.newBuilder().incrBadge(1).addExtras(extrasMap).build())
.build())
.build();
} /**
* 根据标签推送相应的消息
* @param title 推送消息标题
* @param content 推送消息内容
* @param map 推送额外信息
* @param tags 推送的目标标签
* @return
*/
public PushPayload buildPushLoadByTags(String title,String content,Map<String,String> map,String... tags) {
if(map.isEmpty()){
map = new HashMap<>();
}
//批量删除数组中的空元素
String[] newTags = removeArrayEmptyElement(tags);
return PushPayload.newBuilder()
//设置推送平台为安卓
.setPlatform(Platform.android())
//设置标签
.setAudience(Audience.tag(tags))
//设置 推送的标签标题
// 设置通知方式(以alert方式提醒)
.setNotification(Notification.newBuilder().setAlert(content)
.addPlatformNotification(AndroidNotification.newBuilder().setTitle(title).addExtras(map).build()).build())
//sendno int 可选 推送序号 纯粹用来作为 API 调用标识
//离线消息保留时长 推送当前用户不在线时,为该用户保留多长时间的离线消息(默认 86400 (1 天),最长 10 天。设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到)
//apns_production boolean 可选 APNs是否生产环境 True 表示推送生产环境,False 表示要推送开发环境; 如果不指定则为推送生产环境
//big_push_duration int 可选 定速推送时长(分钟) 又名缓慢推送,把原本尽可能快的推送速度,降低下来,在给定的 n 分钟内,均匀地向这次推送的目标用户推送。最大值为 1440。未设置则不是定速推送
// .setOptions(Options.newBuilder().setApnsProduction(false).setTimeToLive(8600).setBigPushDuration(1).build())
//设置通知内容
// .setMessage(Message.newBuilder().setTitle("").setMsgContent("").setContentType("").build())
.build();
} /**
* 构建Android和IOS的自定义消息的推送消息对象
*
* @return PushPayload
*/
private PushPayload buildCustomPushPayload(String title, String content, Map<String, String> extrasMap, String... alias) {
// 批量删除数组中空元素
String[] newAlias = removeArrayEmptyElement(alias);
return PushPayload.newBuilder().setPlatform(Platform.android_ios())
.setAudience((null == newAlias || newAlias.length == 0) ? Audience.all() : Audience.alias(alias))
.setNotification(Notification.newBuilder().setAlert(content)
.addPlatformNotification(AndroidNotification.newBuilder().setTitle(title).addExtras(extrasMap).build()).build())
.setMessage(Message.newBuilder().setTitle(title).setMsgContent(content).addExtras(extrasMap).build())
.build();
} /**
* 删除别名中的空元素(需删除如:null,""," ")
*
* @param strArray
* @return String[]
*/
private String[] removeArrayEmptyElement(String... strArray) {
if (null == strArray || strArray.length == 0) {
return null;
}
List<String> tempList = Arrays.asList(strArray);
List<String> strList = new ArrayList<String>();
Iterator<String> iterator = tempList.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
// 消除空格后再做比较
if (null != str && !"".equals(str.trim())) {
strList.add(str);
}
}
// 若仅输入"",则会将数组长度置为0
String[] newStrArray = strList.toArray(new String[strList.size()]);
return newStrArray;
}

8.测试类

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class JgTest {
@Autowired
JpushUtils jpushUtils; @Test
public void testSendMessage() throws APIConnectionException, APIRequestException {
String title = "工单受理";
String content = "工单已发起,请开始受理工单信息,谢谢!";
Map<String,String> map = new HashedMap<>();
//设置标签
HashSet hashSet = new HashSet();
hashSet.add("ywb");
//可以设置多个tag别名
//hashSet.add("客服");
map.put("message","额外的message消息"); //13_1711406300 12_1743331095
PushResult pushResult = jpushUtils.sendCustomPush(title, content, map, "17_ywb");
System.out.println(pushResult.getResponseCode());
//log.info(String.valueOf(pushResult.statusCode));
log.info(String.valueOf(pushResult.sendno));
//设置、更新、设备的 tag, alias 信息。140fe1da9e38e9efd3e
jpushUtils.UpdateDeviceTagAlias("140fe1da9ec6c5fc7af",null,hashSet,null);
} @Test
public void testSendMessageByTags() throws APIConnectionException, APIRequestException {
String title = "工单受理new";
String content = "工单已发起,请开始受理工单信息,谢谢!";
Map<String,String> map = new HashedMap<>();
//设置标签
HashSet hashSet = new HashSet();
hashSet.add("ywb");
//可以设置多个tag标签
//hashSet.add("客服");
map.put("message","其他的message消息");
String[] tags = new String[]{"support"};
PushResult pushResult = jpushUtils.sendPush(title, content, map, tags);
System.out.println(pushResult.getResponseCode());
}
}

9.通过账号登录官网可以看到推送历史记录

详细信息

10:注:手机安装相应的App,安卓端需要知道当前注册账号的AppKey,然后就可以收到服务端发送的消息

Springboot项目集成JPush极光推送(Java SDK)的更多相关文章

  1. Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  2. 极光推送>>java SDK服务端集成后台项目(使用详解)

    PS:如果你是第一次用推送,那就直接按照我的步骤来,再去看官方文档,这样,更容易能理解操作流程.还有——-请耐心看 极光文档(java SDK)请参考 [ 极光文档 ] 步骤一: 首先,你必须在 [极 ...

  3. AndroidStudio离线打包MUI集成JPush极光推送并在java后端管理推送

    1.AndroidStudio离线打包MUI 如何离线打包请参看上篇随笔<AndroidStudio离线打包MUI> 2.集成极光推送 官方文档:https://docs.jiguang. ...

  4. JPush极光推送 Java调用服务器端API开发

       极光推送是:使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动,从而有效地提高留存率,提升用户体验.简单的说就是通过JPush后台管理网站进行app消息的推送.可以让用户及时 ...

  5. Android集成JPush极光推送

    推送原理 参考网址:https://blog.csdn.net/huangli1466384630/article/details/79889473 SDK下载 https://docs.jiguan ...

  6. JPush极光推送Java服务器端实例

    import cn.jpush.api.JPushClient; import cn.jpush.api.common.resp.APIConnectionException; import cn.j ...

  7. JPush极光推送Java服务器端API

    // 对android和ios设备发送 JPushClient jpush = new JPushClient(masterSecret, appKey);   // 对android和ios设备发送 ...

  8. Ionic项目中使用极光推送

    Ionic项目中使用极光推送-android   对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档) ...

  9. atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99

    atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99 1.1. 云推送有推送次数或频率的限制吗? 1 1.2. 推送的消息长度 1 1.3. 离线消 ...

随机推荐

  1. Fabric1.4 kafka共识的多orderer集群

    https://www.cnblogs.com/zhangmingcheng/p/10556469.html#FeedBack https://yq.aliyun.com/articles/63746 ...

  2. 20190916-01linux文件与目录结构 000 001

    1./bin 是Binary的缩写,这个目录存放着最经常使用的命令 2./sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 3./home 存放普通用户的主目录,在 ...

  3. 上传文件到服务器指定位置 & 从服务器指定位置下载文件

    需要的jar包: 去maven仓库自己搜索com.jcraft下载jar包 <dependency> <groupId>com.jcraft</groupId> & ...

  4. 蓝奏网盘API

    蓝奏云网盘API 2.0 基于Python3实现,最强的蓝奏云API~ 蓝奏云注册 更新说明 修复了登录时 formhash 错误的问题 解决了多次上传大文件被限制的问题 #3 细化 API 接口的功 ...

  5. SpringBoot集成Nacos

    一.环境说明 1.CentOS7 2.Jdk1.8 3.Mysql5.7 4.Nacos1.3 5.SpringBoot2.3.1.RELEASE 6.Maven3.6 二.下载Nacos 1.Nac ...

  6. oracle数据处理之exp/imp

    oracle 导出/导入数据方法一 exp/imp工具:1 将数据库oracle01完全导出,DBA:sys,密码:123456:用户名Scott 密码123456 导出到D:\emp.dmp中 ex ...

  7. [LeetCode]647. 回文子串(DP)

    ###题目 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc&q ...

  8. [ArcGIS]高程地图-把DEM栅格数据(.tif)转换为TIN矢量数据,并储存TIN数据。

    把DEM数据(.tif)获得栅格数据对应的经纬度及高程信息,存到地理数据库 一.预处理工作 栅格数据的合并--目的:将原始4张Dem(.tif)数据合并为一张Dem(.tif) https://wen ...

  9. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  10. 学习 | iscroll之上拉加载下拉刷新

    引入文件顺序 1.zepto 2.iscroll.js 3.scroll-probe.js 链接 完整代码:https://github.com/dirkhe1051931999/writeBlog/ ...