Java服务端集成Google FCM推送的注意事项和实际经验

简介: 公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。

公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。


查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。


从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。


1.http://t.csdn.cn/hxNqh,这篇文章告诉你集成推送为何要创建Firebase项目。看后豁然开朗,介绍了FCM有两种消息: Data Message和 Notification Message.就是透传消息和通知栏消息。根据实际测试,只有app在前台的时候由app应用进行发送通知消息,当app在后台的时候由系统弹通知栏,当app被杀死的时候,从Firebase后台发送是收不到的,因为控制台只能发送通知栏消息,所以收不到,但是通过后端集成是可以让杀掉的app收到推送的。


作者文章出现了以下集成方式


Firebase后台发送是收不到的

 1 http请求:

 2 https://fcm.googleapis.com/fcm/send

 3

 4 Content-Type:application/json

 5 Authorization:key= App Key

 6 {

 7     "notification" : {

 8       "body" : "You have a new message",

 9       "title" : "",

10       "icon" : "app icon"

11     },

12     "to" : "user token"

13 }

(2)Data Message:

不管app在后台还是前台都会走这个方法。

1 http请求:

 2 https://fcm.googleapis.com/fcm/send

 3

 4 Content-Type:application/json

 5 Authorization:key= App Key

 6 {

 7     "data" : {

 8       "request" : "1",

 9       "xxx" : "xxx"

10     },

11     "to" : "user token"

12 }

看官方文档,也有该种方式,由于一开始接触官方文档是通过SDK的方式进行的,该种api的方式给我带来困惑,怎么还有这种方式集成吗,后来了解到,这是http的方式调用的,而sdk集成是封装好的,不可混用。测试时,用该种http方式非常方便,尤其是进行透传消息Data Message测试时,很方便,但是我没发送成功,可能还是国内环境的问题。多种调用方式当时也困惑了我很久,因为官方文档介绍集成时是sdk和http调用、以及oauth一起介绍的,弄晕了,用哪种是对的呢。根据集成便捷及使用性当然首选SDK的方式集成。


如果想了解更多http服务器调用API的方式可看http://t.csdn.cn/dOn5y


1.2admin-sdk导入采用了方便的maven进行sdk集成

<dependency> <!-- 谷歌推送依赖 -->

   <groupId>com.google.firebase</groupId>

   <artifactId>firebase-admin</artifactId>

   <version>6.10.0</version>

</dependency>

1.3.在进行FirebaseApp.initializeApp(options)时,如下

ClassPathResource classPathResource = new ClassPathResource("{firebase下发的json}");

FirebaseOptions options = new FirebaseOptions.Builder()

.setCredentials(GoogleCredentials.fromStream(inputStream))

.setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")//

.build();

 firebaseApp = FirebaseApp.initializeApp(options)时

不管多个博客还是官方文档,都有.setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")这个调用,我在集成时,这个到底要不要填写时,很少困惑,把握不准,没有一个地方说这个方法是否使用,如果使用,这个DatabaseUrl应该如何配置,最后在实际的测试过程中,结论是如果是单独集成FCM的推送功能,setDatabaseUrl可以完全去掉不写,一点也不影响Firebase的初始化和消息的推送.


而最终的初始化如下:


 @PostConstruct

    public void init() {

        try {

            //initProxy("127.0.0.1", 8089);

            ClassPathResource cpr = new ClassPathResource("serviceAccountKey.json");

            InputStream inputStream = cpr.getInputStream();

            FirebaseOptions options = FirebaseOptions.builder()

                    .setCredentials(GoogleCredentials.fromStream(inputStream))

                    .build();

            //初始化firebaseApp

            firebaseApp = FirebaseApp.initializeApp(options);

        } catch (Exception e) {

            log.error("google FirebaseApp initializeApp fail = {}", e);

        }

    }

serviceAccountKey.json获取和在项目中存放的位置





2.http://t.csdn.cn/e8QjT,这篇文章通过详细的图文介绍了Firebase平台如何创建一个安卓项目,如何配置,安卓端如何使用,在Firebase的网页控制台,如何进行通知消息的测试。但是呢,这篇文章没有说,管理台发的消息只能是通知栏消息,不能发透传消息(有的又叫数据消息),也没有有介绍到服务端如何集成,但是创建Firebase安卓项目还是可以参考的


题外话:Firebase平台创建好Android项目时,Google Play会自动生成一个Android应用项目,不过没包名,在Google Cloud平台会生成集成三方登录的所需要的秘钥等信息,三方登录和支付理解起来比推送更复杂,看文档和博客让人更困惑,此处暂时不细表。


如果仅仅推送通知栏消息,app杀掉、进程不再时就不收到通知,可以用通知栏消息 Notification Message.


Message message = Message.builder()

    .setNotification(Notification.builder()

        .setTitle("我是push标题")

        .setBody("我是你push的内容")

        .build())

    //.putAllData(map);

    .setToken(registrationToken)

    .build();

String response = FirebaseMessaging.getInstance(firebaseApp).send(message);

如果想要app杀掉后,进程不在也能收到push,可以使用透传消息Data Message,实际测试中发现,data透传有的手机杀掉能收到,有的收不到。


Message message = Message.builder()

    .putData("title", "我是push标题")

    .putData("body", "我是push内容")

    //.putAllData(map);

    .setToken(registrationToken)

    .build();

String response = FirebaseMessaging.getInstance(firebaseApp).send(message);

如果setNotification和data一起传递,是通知栏消息。


使用透传,通知栏的显示最终都要由Android端主动send才会显示出来。


3.FCM实现消息推送,介绍了官方FCM推送api的github地址:GitHub - firebase/firebase-admin-java: Firebase Admin Java SDK,集成的是 AndroidConfig androidConfig=androidConfigBuilder.build();讲了如果多个app调用fcm服务,采用一个map来保存每个 app对应的FirebaseApp信息;也介绍了代理的方法,在发送之前,一定需要进行参数设置,让请求走代理方式,因为谷歌的服务器在国内都是被禁的。


这篇文章给我带来了很多困惑,难道安卓实现推送,还得专门这样写吗,后端还得拿到安卓端的图标、铃声、通道、跳转页面等等,一堆繁琐的配置,不走代理不行吗。json格式文件哪来的,需要手动配置吗。最后开发完了,回头看官方文档,才明白,androidConfigBuilder.build();这种集成方式是针对安卓设备进行推送,给安卓设备推送,可用可不用该种方式,根据实际集成便捷性来看,果断否定了该种集成方式。


而使用了最普遍的发送方式,如2.介绍的通知栏和透传实现。当然仅仅介绍的是单个设备的发送。如果想了解多个设备、订阅等其他方式,官方文档介绍的就非常好。


相关文章
|
3月前
|
NoSQL Java Shell
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
168 8
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
|
7月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
380 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
4月前
|
JSON 前端开发 算法
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
296 23
|
9月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
1941 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
7月前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
333 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
6月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
8月前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
157 9
|
8月前
|
SQL Java API
|
8月前
|
Java API Apache
java集成stable diffusion
通过REST API和JNI两种方法,我们可以在Java应用程序中集成Stable Diffusion模型。REST API方法更加简单和易于维护,而JNI方法则提供更高的性能。根据具体应用场景和需求,选择合适的集成方法,可以充分利用Stable Diffusion的强大功能,实现高效的图像生成和处理。
196 15
|
11月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
600 1