需求背景

我方项目需要支持客户端消息推送,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. ParentViewController中添加SubViewController(IOS学习)

    我是用的是Container.addSubView的方法. 1. ParentViewController.m的@interface()中添加2个子vc的实例变量,代码如下 @property (no ...

  2. PopupWindow 防微信弹出右 侧窗体(继承PopupWindow )

    1, pop自定义 public class SelectPicPopupWindow extends PopupWindow { private Button btn_take_photo, btn ...

  3. C++中const型数据的小结

    由于与对象又管的const型数据种类较多,形式又有些相似,往往难记,容易混淆,因此总结一下相关用法,具体用法可查看下方链接 C++中对象的常引用 C++中指向对象的常指针和指向常对象的指针 C++中的 ...

  4. mac上如何查看gif

    今天生成了一个gif,结果用mac自带的图片预览功能打开,图片被切成一张一张的,不是动图效果了.原以为还得下第三方看图软件,后来百度下发现mac本身也可以打开. 方法一: 鼠标右击图片,选择“快速查看 ...

  5. Ubuntu 使用 heirloom-mail 调用外部邮箱 SMTP 服务器发送邮件

    使用本地服务发邮件,经常被过滤掉而且占用资源,发送成功率不高.所以使用外部SMTP服务器发送邮件成为了需求. SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰,简单地说就是要求必须在提供了账户名和 ...

  6. 转:Linux下用Jmeter做接口测试

    本地设计 首先在本地设计 Apache JMeter 测试计划,大家可以参考<接口测试之 JMeter 初探> ,这里不再重复. 服务器配置 确保服务器已经安装了JDK和Python. 在 ...

  7. vivado中如何调用chipscope或者impact

    vivado中并没有集成chipscope和impact,所以需要安装ISE,安装完ISE后进行以下操作: 1)     选择环境变量中的系统变量,新建以下变量 XILINX             ...

  8. 39、生鲜电商平台-redis缓存在商品中的设计与架构

    说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc ...

  9. Asp.net Core 启动流程分析

    新建的.net core 程序启动本质上是一个控制台应用程序,所以它的入口在Main方法中,所以启动的开始时从Main方法开始. public class Program { public stati ...

  10. PHP7中Protobuf的安装使用

    PHP7中Protobuf的安装使用 写这篇文章的缘由是最近在关注RPC框架序列化的一些原理.但是在安装Protobuf的时候,发现网上的教程都太老了,加上目前Protobuf官方已经支持PHP了,不 ...