消息推送

移动推送(Mobile Push)是提供给移动开发者的移动端消息推送服务,通过在App中集成推送功能,进行高效、精准、实时的消息推送,从而使业务及时触达用户,提高用户粘性。

一:导入jar包

        <!-- 阿里消息推送 --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-push</artifactId><version>3.13.5</version> </dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>2.4.2</version></dependency><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.16</version></dependency>

注:aliyun-java-sdk-push (3.13.5) 这个在(2020-11-25)时是最新的jar包,如果你是从阿里官方下下来的demo中版本是(3.0.0)这个版本的一下参数是用数字来作为值的。
例:

AndroidOpenType

(旧): 点击通知后动作,1:打开应用 2: 打开应用Activity 3:打开 url 4 : 无跳转逻辑
(新):点击通知后动作。可取值,APPLICATION:打开应用(默认值,ACTIVITY:打开应用AndroidActivityURL:打开URL ,NONE:无跳转;

Type

(旧):0:表示消息(默认为0), 1:表示通知
(新):推送类型。取值:MESSAGE:表示消息。NOTICE:表示通知。

二:定义枚举类

public enum AndroidNotifyTypeEnum {VIBRATE("VIBRATE", "振动(默认值)"),SOUND("SOUND", "声音"),BOTH("BOTH", "声音和振动"),NONE("NONE", "静音");private String key;private String desc;AndroidNotifyTypeEnum(String key, String desc) {this.key = key;this.desc = desc;}public String getDesc() {return desc;}public String getKey() {return key;}
}
public enum AndroidOpenTypeEnum {APPLICATION("APPLICATION","打开应用(默认值)"),ACTIVITY("ACTIVITY","打开应用AndroidActivity"),URL("URL","打开URL"),NONE("NONE","无跳转");private String key;private String desc;AndroidOpenTypeEnum(String key, String desc){this.key = key;this.desc = desc;}public String getKey() {return key;}public String getDesc() {return desc;}
}
public enum PushTypeEnum {MESSAGE("MESSAGE","消息"),NOTIFICATION("NOTICE","通知");private String key;private String desc;PushTypeEnum(String key, String desc){this.key = key;this.desc = desc;}public String getKey() {return key;}public String getDesc() {return desc;}
}
public enum TargetEnum {DEVICE("DEVICE","根据设备推送"),ACCOUNT("ACCOUNT","根据账号推送"),ALIAS("ALIAS","根据别名推送"),TAG("TAG","根据标签推送"),ALL("ALL","推送给全部设备(同一种DeviceType的两次全推的间隔至少为1秒)"),TBD("TBD","初始化持续推送,推送目标由后续的ContinuouslyPush接口指定");private String key;private String desc;TargetEnum(String key, String desc){this.key = key;this.desc = desc;}public String getKey() {return key;}public String getDesc() {return desc;}
}
public enum RedisKeyEnum {/****/ALI_MESSAGE_PUSH("RedisMap:ALI_MESSAGE_PUSH","消息推送-设备id");;private String key;private String desc;RedisKeyEnum(String key, String desc){this.key = key;this.desc = desc;}public String getDesc() {return desc;}public String getKey() {return key;}
}

三:将需要的参数配置到yml文件

四:保存设备id到redis中

在登录的时候将设备id保存到redis中

   private static StringRedisTemplate redisTemplate;/*** 将值保存到redis的一个map中* @param key redis的key* @param hashKey map的key* @param value 值*/public static void hPut(String key, String hashKey, String value) {redisTemplate.opsForHash().put(key, hashKey, value);}/*** 获取保存在redis的map中的某一个值* @param redisKey redis的key* @param hashKey map的key* @return*/public static String hget(String redisKey,String hashKey) {Object obj = redisTemplate.opsForHash().get(redisKey, hashKey);String rsp = obj == null ? "" : obj.toString();return rsp;}
// 保存设备id 将用户id最为key
RedisUtil.hPut(RedisKeyEnum.ALI_MESSAGE_PUSH.getKey(), String.valueOf("用户id"), "前端传的设备id");

五:推送消息工具类

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.jianxun.nash.common.enums.*;
import com.jianxun.nash.common.exception.SystemException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** @author 17347*/
@Component
public class AdvancedPushUtils {private static final Logger log = LoggerFactory.getLogger(AdvancedPushUtils.class);@Value("${aliMessagePush.accessKeyId}")private String accessKeyId;@Value("${aliMessagePush.accessKeySecret}")private String accessKeySecret;@Value("${aliMessagePush.appKey}")private Long appKey;private static final String REGION_HANGZHOU = "cn-hangzhou";/*** 推送信息到指定Android用户* @param userId* @param message* @param title* @throws Exception*/public void sendMessageByUserId(int userId,String message,String title) throws Exception {// 获取保存在redis中的设备idString deviceID = RedisUtil.hget(RedisKeyEnum.ALI_MESSAGE_PUSH.getKey(), String.valueOf(userId));if(StringUtils.isBlank(deviceID)) {log.info("用户未绑定deviceID");return ;}log.info("对deviceID:" + deviceID + "的用户推送信息");PushResponse pushResponse = pushNoticeToAndroidToAccount(deviceID, message, title, PushTypeEnum.MESSAGE.getKey(),null);if (pushResponse != null){log.info("针对deviceID:" + deviceID + "的信息推送成功!");log.info("RequestId:" + pushResponse.getRequestId());log.info("MessageId:" + pushResponse.getMessageId());}else {log.info("针对registId:" + deviceID + "的信息推送失败!");}}/*** 推送通知到指定Android用户* @param userId* @param title* @param message* @param summary* @throws Exception*/public void sendNoticeByUserId(int userId,String title,String message, String summary) throws Exception {String deviceID = RedisUtil.hget(RedisKeyEnum.ALI_MESSAGE_PUSH.getKey(), String.valueOf(userId));if (deviceID == null) {log.info("用户未绑定deviceID");return;}log.info("对deviceID:" + deviceID + "的用户推送通知");PushResponse pushResponse = pushNoticeToAndroidToAccount(deviceID, message, title, PushTypeEnum.NOTIFICATION.getKey(), summary);if (pushResponse != null) {log.info("针对deviceID:" + deviceID + "的通知推送成功!");log.info("RequestId:" + pushResponse.getRequestId());log.info("MessageId:" + pushResponse.getMessageId());} else {log.info("针对registId:" + deviceID + "的通知推送失败!");}}/*** 阿里 推送通知给android* <p>* 参见文档 https://help.aliyun.com/document_detail/30082.html*/public PushResponse pushNoticeToAndroidToAccount(String deviceID, String message, String title, String pushType, String map) throws ClientException {IClientProfile profile = DefaultProfile.getProfile(REGION_HANGZHOU, accessKeyId, accessKeySecret);DefaultAcsClient client = new DefaultAcsClient(profile);// 检查这个设备id是否有if (StringUtils.isBlank(deviceID)) {SystemException.myException(ExceptionMsg.ASSERT_NOT_NULL);}PushRequest pushRequest = new PushRequest();// 设置NotificationChannel参数,具体用途请参见常见问题:Android 8.0以上设备通知接收不到。// 值要与前端相同 也可以不要pushRequest.setAndroidNotificationChannel("hrss");// 提交方式pushRequest.setProtocol(ProtocolType.HTTPS);pushRequest.setMethod(MethodType.POST);// 推送目标 推送给指定设备—idpushRequest.setPushType(pushType);pushRequest.setTarget(TargetEnum.DEVICE.getKey());pushRequest.setTargetValue(deviceID);pushRequest.setAndroidNotifyType(AndroidNotifyTypeEnum.VIBRATE.getKey());pushRequest.setAndroidOpenType(AndroidOpenTypeEnum.APPLICATION.getKey());pushRequest.setDeviceType(EquipmentEnum.ALL_EQUIPMENTENUM.getKey());// 推送内容  顺序 标题(Title),内容(Body),摘要(summary) (map)AndroidExtParameterspushRequest.setTitle(title);pushRequest.setBody(message);pushRequest.setAndroidExtParameters(map);pushRequest.setAppKey(appKey);PushResponse acsResponse = client.getAcsResponse(pushRequest);return acsResponse;}}

测试

 @AutowiredAdvancedPushUtils advancedPushUtils;@Testpublic void test07() throws Exception {// deviceID 前端给的用于测试advancedPushUtils.pushNoticeToAndroidToAccount("b6d5faa73d8842178be06da3e8c267b0","你好,今天的代码请签收","签署", PushTypeEnum.NOTIFICATION.getKey(),null);}


阿里-消息推送java后端,设备方式推送相关推荐

  1. 极光推送:java后台向APP推送消息(android,ios极光推送消息)

    Maven添加依赖 <!--极光推送--><dependency><groupId>cn.jpush.api</groupId><artifact ...

  2. java后端使用信鸽推送

    在我们进行安卓开发的时候,使用到信息推送,将信息推送到手机的任务栏当中. 一般使用的是由腾讯的信鸽推送,具体实现看代码,[记得去腾讯信鸽申请AppID和SecretKey,申请地址:https://x ...

  3. 小米推送 java demo_XiaomiPushDemo【小米推送集成,基于V3.6.12版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录小米推送的集成,不能运行. 使用步骤 一.项目组织结构图 注意事项: 1.  导入类文件后需要change包名以 ...

  4. 阿里妈妈技术联盟Java后端研发五轮技术面总结

    2019年03月12日内推简历投递 2019年04月19日面完HR面 2019年04月30日收到录取意向书 部门:阿里集团-阿里妈妈事业群-阿里妈妈事业部-联盟业务 阿里一面(60min)(基础面) ...

  5. 极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)

    极光推送常用的几个api方法总结,抽取出了utils类,利用MsgType进行业务类型区别,方便app端收到推送后进行不同处理: 首先引入依赖: <!-- 极光推送 --><depe ...

  6. 极光推送java服务器端_极光推送服务器端(JAVA)

    准备工作:appkey和secret两个码.(在极光官网管理页面新增相关应用,就会获得对应的appkey和secret,这部分由移动端同事完成) 1.在pom文件下添加这个包: 2.添加工具类JPus ...

  7. 阿里菜鸟面经 Java后端开发 社招三年 已拿offer

    一面 自我介绍 略 项目介绍 略 项目提问 略 通用技术问题: Java里的Object equals() 和 hashCode() 为什么需要重写? JVM 垃圾回收的时机 有两个动作 下订单 和 ...

  8. 小米杀不死的消息推送-- Android、java后端同时接入小米推送

    作者简介 微信公众号(高质量文章推送):陈博易 前言 小米手机选择小米推送的原因:App进程被杀死的情况下,小米手机上的小米推送服务并不会被杀死(除非用户手动在设置中关闭了该推送的权限),所以我选择给 ...

  9. Java中集成极光推送实现给Android提送消息通知(附代码下载)

    场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

最新文章

  1. 图片管理之获取图片列表数据
  2. python入门基础语发_Python基础入门-基础语法
  3. Windows下使用Telnet 命令测试端口号
  4. 082_Timing事件
  5. 张家港职称计算机应用能力考试,2016年江苏张家港计算机应用能力考试零基础备考...
  6. Swift之深入解析Key Paths的功能与应用
  7. python 代码片段24
  8. iOS 中 常用的第三方库
  9. 王乐园 php_见到海贼王主题乐园的雕像,感觉认知回不去了,索隆是认真的?...
  10. matlab激光雷达三角测距,三角测距激光雷达原理
  11. postman文件导入
  12. chrome 同站策略(samesite)问题及解决方案
  13. ansys linux运行_ANSYS2020R1 产品Linux平台安装
  14. python默认字体大小_如何设置PIL加载的默认字体的大小,使其适合我的8x8矩阵?...
  15. 罗尔定理与零点定理判断实际应用与判断
  16. CFG保护机制校验逻辑分析
  17. OMA DRM 1.0 – OMA Download 框架
  18. 2022年520最实用的礼物,苹果平板的触控笔
  19. 推荐系统指标——关于NDCG等ranking measures的一个问题
  20. 1998考研阅读Text3翻译

热门文章

  1. java httpinvoker_Spring中HttpInvoker实例
  2. 智慧能源管控系统开发
  3. Java Executor源码解析(7)—Executors线程池工厂以及四大内置线程池
  4. vue3—使用element-plus表格导出excel表格(带图片)
  5. 从blast数据库中批量下载-Aspera
  6. 计算机减法函数word,word的减法 word减法函数
  7. iPhone 11 Pro上手:亚光玻璃手感好,拍照真快
  8. IC设计——EDA软件篇——xcelium
  9. Image Processing Machine Vision 2022 图像处理与机器视觉
  10. ‘packaging’ with value ‘jar’ is invalid. Aggregator projects require ‘pom’ as packaging. @ line 3, c