基于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.准备工作.先 ...
随机推荐
- python 基础 字典 小例子
统计单词次数 作为字典存储 cotent = "who have an apple apple is free free is money you know" result = { ...
- Linux UDP通信例子
UDP C/S编程的步骤如下图所示 ////server.c #include <sys/types.h> #include <sys/socket.h> #include&l ...
- Ruby环境搭建与“Hello World”
Ruby的环境搭建比较简单,在http://rubyinstaller.org/downloads/可以得到Ruby的安装包, 安装过程没什么问题.安装完成之后需要配置一下环境变量: 在PATH中填入 ...
- python tarfile模块基本使用
1.压缩一个文件夹下的所有文件 #coding=utf8 import os import tarfile __author__ = 'Administrator' def main(): cwd = ...
- css中的定位属性position(转)
css中的定位属性position 同样的也是上课的时候发现学生难以理解的一些问题拿出来记录一下,希望帮助初学者. 在css中定位属性position的运用在页面中是很常用的,特别是一些结合js来 ...
- mongodb的备份还原
一:备份数据库 G:\Program Files\MongoDB\Server\3.0\bin>mongodump -d mydb -o g:/data/back mongodump -h IP ...
- [转发]深入理解git,从研究git目录开始
转发学习的啦. 似乎很少有人在读某个git快速教程的时候会说:“这个关于git的快速教程太酷了!读完了用起git来超级舒服,并且我一点也不怕自己会破坏什么东西.” 对git的初学者来说,刚接触git时 ...
- 【转】如何配置EditPlus中Java运行环境,运行Java程序
如何配置EditPlus中Java运行环境,运行Java程序 http://jingyan.baidu.com/article/86112f13725e2e2736978711.html 分步阅读 E ...
- App集成极光推送步骤
一.准备: 1.1注册极光开发者账号 1.2添加应用,获取AppKey 1.3下载提供的demo,demo中的AppKey已自动生成为你自己的AppKey 二.集成: 2.1第一种方式:自动集成 Mo ...
- JAVA对象创建的过程
Java中一个实例对象被创建的过程 一.类的加载过程 首先,Jvm在执行时,遇到一个新的类时,会到内存中的方法区去找class的信息,如果找到就直接拿来用,如果没有找到,就会去将类文件加载到方法区.在 ...