需求背景

我方项目需要支持客户端消息推送,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的消息推送功能的更多相关文章

  1. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

  2. ZH奶酪:基于ionic.io平台的ionic消息推送功能实现

    Hybrid App越来越火,Ionic的框架也逐渐被更多的人熟知. 在mobile app中,消息推送是很必要的一个功能. 国内很多ionic应用的推送都是用的极光推送,最近研究了一下Ionic自己 ...

  3. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  4. xamarin.android 消息推送功能--极光推送

    最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...

  5. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

    最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...

  6. Android 基于Netty的消息推送方案之对象的传递(四)

    在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...

  7. Android 基于Netty的消息推送方案之字符串的接收和发送(三)

    在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...

  8. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  9. 采用PopupWin控制消息推送功能

    最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...

随机推荐

  1. linux命令-vim一般模式下复制剪切粘贴

    删除光标后的一个字符 x 删除光标前的一个字符 shift+x 删除指定个数的字符 数字+x 删除一行字符 dd 剪切指定行数  数字dd  3dd 剪切3行 其实并没有删掉而是保存着剪切板里 粘贴在 ...

  2. [xdoj1158]阶乘求逆元(常用于求组合数)

    http://acm.xidian.edu.cn/problem.php?id=1158 解题关键:此题注意将$\sum\limits_{i = 0}^x {C_x^iC_y^{i + k}}$转化为 ...

  3. [cf839d]Winter is here容斥原理

    题意:给定一个数列${a_i}$,若子序列长度为$k$,最大公约数为$gcd$,定义子序列的权值为$k*\gcd (\gcd  > 1)$.求所有子序列的权值和. 答案对10^9+7取模. 解题 ...

  4. JDBC操作MySQL(crud)

    这两天复习了一下JDBC操作MySQL,把crud操作的例子记一下, 类库链接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.co ...

  5. mongodb切换到admin

    127.0.0.1:后面是端口,/admin是切换到管理员权限 cd C:\Program Files\MongoDB\Server\3.0\bin mongo.exe 127.0.0.1:27017 ...

  6. warning no newline at the end of file

    main.c :10:2 warning: no newline at the end of file 修复这个警告,在文件结尾回车一下就行了.可以很少会有人去仔细探究,为什么gcc会给出这么一个警告 ...

  7. Leetcode:206. Reverse Linked List

    这题直接ac掉 class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; while(he ...

  8. p4171&bzoj1823 满汉全席

    传送门(洛谷) 传送门(bzoj) 题目 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能 ...

  9. Struts2学习第七课 通配符映射

    一个WEB应用可能有长百上千个action声明,可以利用struts提供的通配符映射机制吧多个彼此相识的映射关系简化为一个映射关系. 通配符映射规则: --若找到多个匹配,没有通配符的那个将胜出(精确 ...

  10. 20. CTF综合靶机渗透(十三)

    靶机说明: Wellcome to "PwnLab: init", my first Boot2Root virtual machine. Meant to be easy, I ...