基于FCM的消息推送功能
需求背景
我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理。考虑到项目需要以及成本,我们选择使用谷歌的FCM框架来实现,因为我们项目针对消息的可到达率要求并不高,而且推送消息的性质是业务低关注度的,重点是我们的项目还是海外项目,所以一番评估之后发现FCM完全能够满足我们的需求。
文档分析
1、Firebase云消息传递服务器简介
2、FCM服务器协议
3、使用旧版HTTP协议发送
4、使用HTTP方式构建服务器
5、请求授权说明
6、向旧版协议发送请求提供授权
7、使用HTTP旧版协议模式发送请求
8、举例
项目运用
Capation&D的这个项目基于SpringBoot,JDK1.8进行开发。
1、Maven依赖
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.24.1</version>
</dependency>
2、编写工具类
/**
* @Project:captainad-supply-chain
* @PackageName:com.captainad.supply-chain.common.push
* @Author:Captainad
* @blogsite:https://www.cnblogs.com/captainad/
* @DateTime:2018/8/9 15:52.
* @Description: 基于Google Firebase框架实现的实时消息推送功能,目前仅支持Android设备
*/
@Slf4j
@Component
public class FcmPushService { @Autowired
private GetSetCacheService getSetCacheService; @Autowired
private HttpAskInterface httpAskInterface; /**
* 消息推送,推送的消息用于提示,并且点击提示消息将会跳转链接至指定页面
* A: Captain&D
* W: https://www.cnblogs.com/captainad/
* @param deviceToken
* @param title
* @param body
* @param route
* @throws Exception
*/
@Async
public void push(final String deviceToken, final String title, final String body,
final String route, final Integer dataType, final String dataMsg)
throws Exception {
log.info("[START]开始推送FCM消息");
// 请求标头
Map<String, String> requestHeader = new HashMap<>();
requestHeader.put("Content-Type", "application/json; UTF-8");
requestHeader.put("Authorization", "Bearer " + getAccessToken()); // 请求体
JSONObject json = new JSONObject(); JSONObject message = new JSONObject();
message.put("token", deviceToken);
JSONObject data = new JSONObject(); // 发送弹窗提示信息
if(!StringUtils.isEmpty(title) && !StringUtils.isEmpty(body)) {
JSONObject notification = new JSONObject();
notification.put("title", title);
notification.put("body", body);
message.put("notification", notification); data.put("route", route);
// flag: 0-无需跳转,1-需要跳转
data.put("routeFlag", StringUtils.isEmpty(route) ? "0" : "1");
} // 发送数据
if(!StringUtils.isEmpty(dataMsg)) {
data.put("dataType", String.valueOf(dataType));
data.put("params", dataMsg);
} message.put("data", data);
json.put("message", message); log.info("请求json内容===> {}", json.toString());
// https://fcm.googleapis.com/v1/projects/bluepay-tesla/messages:send
String fcmApiUrl = getSetCacheService.getConfigValue("fcm_api_path");
HttpResponse httpResponse = httpAskInterface.synSendPost(fcmApiUrl, json.toString(), requestHeader);
log.info("fcm响应内容===> {}", httpResponse);
log.info("[END]推送FCM消息结束");
} /**
* 获取定时刷新的令牌
* A: Captain&D
* W: https://www.cnblogs.com/captainad/
* @return
* @throws IOException
*/
private String getAccessToken() throws Exception {
String jsonPath = getSetCacheService.getConfigValue("fcm_access_token_json");
URL url = new URL(jsonPath);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
InputStream inputStream = conn.getInputStream(); GoogleCredential googleCredential = GoogleCredential
.fromStream(inputStream)
.createScoped(Arrays.asList("https://www.googleapis.com/auth/firebase.messaging"));
googleCredential.refreshToken();
if(inputStream != null) {
inputStream.close();
}
return googleCredential.getAccessToken();
} }
使用总结
我们只需要申请一个Google开发者账号以及自身企业的一些相关信息,就能够很方便的使用Firebase云消息传递(FCM)提供的众多消息传递选项和功能,上面基于项目的需要实现了Android支持的版本,值得提及的时候,给特定设备推送消息时,需要提前获取到设备的deviceToken,因为它指代了一台唯一特定的设备。另外,如果想批量发送消息的,可以自行扩展出来。
参考资料
1、https://firebase.google.cn/docs/cloud-messaging/concept-options?hl=zh-cn
基于FCM的消息推送功能的更多相关文章
- 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能
一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...
- ZH奶酪:基于ionic.io平台的ionic消息推送功能实现
Hybrid App越来越火,Ionic的框架也逐渐被更多的人熟知. 在mobile app中,消息推送是很必要的一个功能. 国内很多ionic应用的推送都是用的极光推送,最近研究了一下Ionic自己 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- xamarin.android 消息推送功能--极光推送
最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...
- Android 基于Netty的消息推送方案之对象的传递(四)
在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...
- Android 基于Netty的消息推送方案之字符串的接收和发送(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- Android 基于Netty的消息推送方案之概念和工作原理(二)
上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...
- 采用PopupWin控制消息推送功能
最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...
随机推荐
- mysql设置远程登录
服务器上,我们刚安装好MySQL后,是没有办法直接远程的,它只支持本地登录.所以我们必须要对刚安装好的MySQL进行设置,允许远程登录. 1. 使用“mysql -uroot -p”命令可以连接到本地 ...
- Neural Networks and Deep Learning 笔记
1 Introduction to Deep Learning 介绍了神经网络的定义,有监督学习,分析了为什么深度学习会崛起 1.1 结构化数据/非结构化数据 结构化数据:有一个确切的数据库,有key ...
- Entity Framework Code-First(9.11):DataAnnotations - InverseProperty Attribute
DataAnnotations - InverseProperty Attribute: We have seen in the Code-First Convention section that ...
- 15.Nginx 解析漏洞复现
Nginx 解析漏洞复现 Nginx解析漏洞复现. 版本信息: Nginx 1.x 最新版 PHP 7.x最新版 由此可知,该漏洞与Nginx.php版本无关,属于用户配置不当造成的解析漏洞. 使用d ...
- BootStrap2学习日记23---弹出对话框
<a href="#login" data-toggle="modal" class="btn btn-primary">登陆& ...
- 服务器控件button点击时执行脚本弹出提示对话框Button2.Attributes.Add("onclick","事件")
<HTML> <HEAD> <title>**********资料更新</title> <meta content="Microso ...
- 前端页面唯一字符串生成(Js)UUID
function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 3 ...
- 一个APK反编译利器Apktool
一个APK反编译利器Apktool APK 本地化 [http://www.andmoto.com/viewthread.php?tid=3873] 说起APK的汉化,目前大部分教程都是让用H ...
- linux笔记之基础 1
内核命名规则: R.X.Y-Z 2.6.32-642 R: 内核有重大改变时才会更改,目前为止有四个大版本更新. X:基数为开发版,偶数为稳定版. Y.Z:修复bug,实现新功能,新特性的时候更改 ...
- 简单使用phpspider采集本博客文章内容
采集流程 根据链接获取页面内容(curl)->获取需要采集的内容(可以通过正则.xpath.css选择器等方法进行筛选) <?php require_once 'phpspider/aut ...