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.介绍的通知栏和透传实现。当然仅仅介绍的是单个设备的发送。如果想了解多个设备、订阅等其他方式,官方文档介绍的就非常好。


相关文章
|
21天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2564 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
15天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
13天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
17天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1556 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
19天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
829 14
|
14天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
621 7
|
8天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
170 69
|
8天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
167 69
|
19天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
629 53
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界