Firebase 云消息传递 (FCM) 终极指南
了解 FCM 的基本知识、其实施、常见问题和最佳实践。
如果您或您的工程团队使用 Firebase 作为应用程序的后端解决方案,FCM 是推送通知跨平台消息传递解决方案的绝佳选择之一。
本指南将介绍使用 FCM 进行通知的完整方法。
为什么应该使用 Firebase 云消息传递 (FCM) 来推动用户再次互动
推送通知是如今所有成功应用都采用的强大沟通渠道。在很多方面,它是用户与软件交互的主要界面。
这些小型弹出消息由移动应用程序发送到用户设备,当应用程序当前未使用时,可以从设备锁定屏幕查看。
与电子邮件等其他通信渠道不同,推送通知旨在实时查看,并且通常会立即触发用户重新参与。
它们可用于传达提醒、更新、促销等。
推送通知有两种类型:
-
移动推送通知:
移动推送通知是小型的弹出消息,即使用户没有主动使用应用程序,它也会出现在移动设备上。
-
Web 推送通知:
网络推送通知是当访问者打开网络浏览器时显示在访问者的桌面、平板电脑或移动设备上的小型消息警报。
Firebase FCM 如何工作?
FCM 依赖于以下一组组件来构建、传输和接收消息:
1. 消息组成:
要创建消息请求,您可以使用通知编辑器,它拥有用户友好的界面。为了更好地控制和自动化所有消息类型,您需要在支持 Firebase Admin SDK 或 FCM 服务器协议的受信任服务器环境中构建请求。
2.FCM后端:
它处理各种任务,包括接收消息请求、通过主题分发消息以及生成消息元数据(如 ID)。
3.传输层:
消息通过平台特定的传输层发送到设备:
- 适用于具有 Google 服务的 Android 设备的 Android 传输层 (ATL)。
- 适用于 Apple 设备的 Apple 推送通知服务 (APN)。
- 用于 Web 应用程序的 Web 推送协议。
4.用户设备上的 FCM SDK:
用户设备上的 FCM SDK 根据应用的状态(前台/后台)和任何相关的应用逻辑来管理如何显示通知或处理消息。
FCM 推送通知消息类型
使用 FCM,您可以向客户端发送两种类型的消息:
-
Notification messages
有时被认为是“显示消息”。这些由 FCM SDK 自动处理。
- 包含一组预定义的用户可见键。
- 可以包含可选的数据有效载荷。
-
Data messages
由客户端应用处理。相比之下,仅包含用户定义的自定义键值对。
两种消息类型的最大有效负载均为 4000 字节,但从 Firebase 控制台发送消息时除外,因为控制台强制执行 1000 个字符的限制。
notification messages
当您希望默认 FCM SDK 在应用在后台运行时自动处理显示通知时使用。
data messages
当您想使用自己的客户端应用程序代码处理消息时使用。
FCM 可以发送notification message
带有可选数据负载的通知。在这种情况下,FCM 负责显示通知负载,而客户端应用负责处理数据负载。
通知消息
要使用 Admin SDK 或 FCM 协议以编程方式发送通知消息,请 notification
使用通知消息中用户可见部分的必要预定义键值选项集来设置键。
例如,这是即时通讯 (IM) 应用程序中的 JSON 格式的通知消息。
用户将在设备上看到标题为“Hello World”和文本“FCM is awesome!”的消息:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Hello World",
"body":"FCM is awesome!"
}
}
}
Notification messages
当应用处于后台时,通知会被推送到通知托盘。对于前台应用,发送通知消息由回调函数处理。
适用于所有应用包平台的基本通知模板:
JSON 表示:
{
"title":string,
"body":string,
"image":string
}
字段 | 类型 | 描述 |
---|---|---|
标题 | 细绳 | 通知的标题。 |
身体 | 细绳 | 通知的正文。 |
图像 | 细绳 | 包含将要下载到设备并显示在通知中的图片的 URL。JPEG 、PNG 和 BMP 格式在各个平台上均完全支持。 动画 GIF 和视频仅适用于 iOS 系统。WebP 和 HEIF 格式在不同平台和不同版本的支持程度有所不同。Android 系统的图片大小限制为 1MB。 |
数据电文
使用自定义键值对设置适当的键,以便可靠地将带有数据有效负载的消息发送到客户端应用程序。
例如:
以下是与上述相同的 IM 应用程序中的 JSON 格式的消息,其中信息封装在通用 data
密钥中,客户端应用程序需要解释其内容:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "John",
"body" : "Hello World",
"Room" : "FCM_Testers"
}
}
}
上面的例子展示了顶级或公共 data
字段的用法,它由接收消息的所有平台上的客户端进行解释。
在每个平台上,客户端应用程序都会在回调函数中接收数据有效负载。
带有可选数据有效载荷的通知消息
您可以通过编程方式或通过 Firebase 控制台发送notification messages
包含自定义键值对的可选有效负载的信息。
在通知编辑器中,使用 高级选项 中的 自定义数据字段。
应用程序在接收包含通知和数据有效负载的消息时的行为取决于应用程序是在后台还是前台 - 本质上,取决于它在接收时是否处于活动状态。
- 当在后台运行时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。
- 当处于前台时,您的应用程序会收到一个包含两个可用有效负载的消息对象。
notification
以下是包含密钥和 键的 JSON 格式的消息 data
:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Hello World",
"body":"FCM is awesome!"
},
"data" : {
"Nick" : "John",
"Room" : "FCM_Testers"
}
}
}
FCM 推送通知提供商的主要功能
定向分发
通过以下三种方式之一向您的客户端应用分发消息:
- 对于单个设备。
- 对于设备组。
- 对于订阅主题的设备。
送货选项
控制消息传递行为,包括:
- 可折叠的消息限制(将类似的通知分组)
- XMPP 服务器限制(限制消息以防止服务器过载)
- 单个设备的最大消息速率
- 主题消息限制(控制发送到主题的消息)
- 扇出限制(限制发送到大型设备组的消息)
优先事项
支持设置消息优先级(正常或高)以影响传递行为。
生存时间 (TTL)
允许设置消息过期时间,以确保消息不会在特定时间段后传递。
添加推送通知渠道:初级 vs. 高级
在管理跨渠道通知方面,新手和专家的处理方式存在很大差异。让我们来详细分析一下。
青少年之路
初学者通常从单一通知渠道(例如推送或应用内通知)开始,并使用 Firebase 云消息传递 (FCM)。之后,当他们需要更多渠道(例如短信、电子邮件、WhatsApp 或 Discord)时,他们会分别处理每个渠道。
这会形成一个混乱的系统,其中不同的通道以拼凑的方式连接。
以下是 Slack 显示通知的业务逻辑:
保持所有内容都是最新的成为一个令人头疼的问题,因为每个渠道都需要单独的关注。
长者之道
而专家则使用更聪明的方法。他们不会把宝贵的时间花在从头开发某个东西上,也不会把精力浪费在调试和维护基础设施上。
这就像构建自己的数据库,而不是使用已经可以运行和执行的数据库,例如Oracle、MySQL、PostgreSQL 或 MongoDB。
他们使用通知基础设施库,如Novu,其中已经内置了与各种渠道的所有连接,以及大量功能,如摘要引擎、延迟操作或步骤条件。
有了这些库,搭建一个可靠的通知系统变得快速而简单。只需添加必要的组件并连接所需的渠道,例如使用 FCM 推送通知或使用 SendGrid 发送邮件。
这里的主要区别在于每种方法的效率和可扩展性。
新手难以应对临时解决方案和大量维护工作。专业人士则能享受流畅的系统,轻松保持更新,并可根据需要进行扩展。
通过使用专业工具,您可以跨不同渠道无缝沟通,更轻松地接触您的受众,而无需处理管理多个系统的麻烦。
移动设备的 FCM 集成流程
通过 FCM 发送推送通知通常涉及以下步骤
-
客户端应用注册:移动应用安装在设备上,并在应用启动时向 FCM 注册。此注册会为设备生成一个唯一的令牌,用于识别设备接收消息。
-
令牌检索:移动应用检索生成的令牌并将其发送到您的应用服务器。此令牌允许您的服务器定位特定设备或设备组。
-
消息发送:您的应用服务器会准备消息负载,其中包含您想要传递给移动应用的信息。此负载可以是文本、数据或两者的组合。
-
FCM 连接:应用服务器使用 Firebase Admin SDK 或其他库连接到 FCM API。
-
消息传递:应用服务器将消息有效负载和收件人信息(令牌)发送到 FCM API。
-
路由和传递: FCM 充当中介,根据提供的令牌将消息路由到适当的设备。FCM 利用 Google 的基础架构来确保高效可靠的消息传递。
-
唤醒电话(如果需要):如果移动应用程序处于后台,FCM 可能会发送唤醒电话来激活它,以便它可以接收消息。
-
已接收消息:移动应用程序从 FCM 接收消息负载并解析信息。
-
操作(可选):移动应用程序可以显示通知、播放声音、更新其数据或根据消息内容执行任何其他操作。
根据您的具体用例,可能还有其他注意事项,例如错误处理、数据加密和高级通知定制。
Web 应用程序的 FCM 集成流程(Web 推送)
注意:
FCM 主要为移动应用设计。不过,也有一些变通方法可以利用 FCM 在 Web 应用中实现基本的推送通知功能。
通过 FCM 发送 Web 推送通知通常涉及以下步骤
1. Web 推送协议集成:
您将集成 Web 推送协议 (Web Push) 服务,而不是 FCM。Web Push 是一种浏览器支持的标准,用于向 Web 应用发送通知。
可以使用 Firebase Push Notification 服务或其他第三方解决方案等提供商。
2. 用户订阅:
在您的 Web 应用中,实现一种用户订阅通知的机制。这通常需要提示用户授予权限,并为每个订阅用户存储一个唯一的标识符(例如浏览器推送令牌)。
3. 消息准备:
在您的应用服务器上,准备包含消息和任何要传递的数据的通知负载。此结构可能与 FCM 消息略有不同。
4. 推送服务 API 调用:
与 FCM 类似,您的服务器使用其提供的 SDK 或库与 Web 推送服务 API 进行通信。您将向目标订阅者发送消息负载和用户令牌。
5. 通知传递:
Web Push 服务负责路由并将通知传递到订阅用户的浏览器。浏览器会根据其通知权限设置显示通知。
限制
- FCM 与 Web Push 对比:此方法使用单独的 Web Push 服务,而不是直接使用 FCM。与移动应用的 FCM 相比,其功能可能更为有限。
- 浏览器支持: Web Push 功能依赖于浏览器支持,可能并不适用于所有浏览器和设备。
- 后台更新:与移动应用程序不同,网络应用程序关闭时后台更新或消息传递可能会受到限制。
替代方案
如果这些限制对于您的应用程序至关重要,请考虑使用 Web 应用程序通知的替代方法:
- 服务工作者:为您的 Web 应用程序实施服务工作者,以启用后台功能,即使在 Web 应用程序关闭时也能接收和显示通知(更复杂的设置)。
- 实时消息传递:利用实时消息传递解决方案或类似服务,实现与您的 Web 应用的更具交互性和数据驱动性的通信。
总的来说,虽然 FCM 不能直接应用于 Web 应用,但 Novu 可以实现(而且更容易)。
该流程包括设置 FCM 和 Novu,将 Firebase 添加到您的前端项目,然后将 Novu 集成到您的后端以管理和触发通知。此设置允许您通过 Novu 的统一 API 向您的 Web 应用用户发送 FCM 推送通知,从而充分利用 Firebase 的 Web 推送功能。
我们编写了有关如何使用 FCM 和 Novu 发送网络推送通知的指南。
如何在通知工作流中使用 FCM 发送推送通知
什么是通知工作流程?
通知工作流表示为一组步骤,这些步骤可以是功能步骤或渠道步骤。
函数将逻辑应用于您的工作流程运行,例如将多个通知摘要(批处理以折叠)为单个通知或延迟操作以暂停工作流程的执行一段时间。
渠道步骤产生将通过配置的****渠道(短信、电子邮件、推送等)传递的通知。
所有步骤还可以有条件来确定是否以及何时运行。
工作流是将要发送的通知(或消息)的蓝图,包含发送给订阅者(最终用户/收件人)的整个消息流。
它包括工作流的名称和标识符以及渠道定制的内容,确保所有不同的渠道都绑定在一个实体下。
您需要一个通知工作流程,因为它使您能够有效地管理和自定义如何以及何时通过不同渠道向用户传递消息。
拥有明确定义的工作流程可确保您的通知一致、及时且与收件人相关,从而增强用户体验和对您的产品或服务的参与度。
此外,它简化了通知管理流程,允许非技术团队成员轻松地制定和更新通知路由、内容和设计,从而营造更具协作性的环境并更快地迭代您的通知策略。
要将 FCM 与 Novu 集成以发送推送通知,通常需要遵循以下步骤:
1. 设置 Firebase
这涉及在 Firebase 控制台中创建 Firebase 项目、将您的应用添加到该项目以及使用您的应用的平台特定详细信息(Web、Android、iOS)配置 Firebase。
您可以在此文档部分找到更多信息。
2. 设置 Novu
您需要在 Novu Integrations Store 中将 Firebase Cloud Messaging 添加为推送渠道提供商。
您可以在此文档部分找到更多信息。
3. 创建 Novu 工作流程
您可以在此文档部分找到更多信息。
4. 将 FCM 集成到您的前端(客户端)
以下是如何将 FCM 实例添加到前端:
-
这涉及在您的应用中初始化 Firebase、向用户请求通知权限以及处理传入消息。
-
您还必须使用 Firebase 的
getToken
方法为每个设备生成一个令牌,这对于将通知发送到单个设备是必要的。
我们有专门的 FCM 集成指南:
5. 将 Novu 集成到您的后端
以下是如何将 Novu 实例添加到后端:
-
这涉及在您的后端设置 Novu SDK。
-
cURL API 请求示例:
curl --location 'https://api.novu.co/v1/subscribers' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --header 'Authorization: ApiKey <NOVU_API_KEY>' \ --data-raw '{ "firstName": "Pawan", "lastName": "Jain", "email": "pawan.jain@domain.com", "phone": "+1234567890", "avatar": "avatar-url", "locale": "en-US", "data": { "isDeveloper": true, "customKey": "customValue" } }'
-
每个订阅者可以与一个或多个设备令牌(代表不同的设备或浏览器)相关联。
以下是如何向您的订阅者添加设备令牌:
```curl
curl --request PUT \
--url https://api.novu.co/v1/subscribers/{subscriber_id}/credentials \
--header 'Content-Type: application/json' \
--header 'Authorization: ApiKey <YOUR_API_KEY>' \
--data '{
"credentials":{
"deviceTokens": ["token1", "token2"]
},
"integrationIdentifier":"<Provider_Identifier>",
"providerId":"fcm"
}'
```
- 然后,您可以通过指定工作流、订阅者 ID 和通知内容通过 Novu 触发通知。
触发工作流程的方法如下:
```curl
curl -X POST https://api.novu.co/v1/events/trigger \
-H "Authorization: ApiKey <NOVU_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "<WORKFLOW_TRIGGER_IDENTIFIER>",
"to": {
"subscriberId": "<UNIQUE_SUBSCRIBER_IDENTIFIER>",
"email": "john@doemail.com",
"firstName": "John",
"lastName": "Doe"
},
"payload": {
"name": "Hello World",
"organization": {
"logo": "https://happycorp.com/logo.png"
}
}
}'
```
我们有出色的快速入门指南和 SDK 来帮助您入门。
一切设置完成后,您可以通过调用 Novu API 并使用适当的参数从后端发送通知。然后,Novu 将使用 FCM 服务将推送通知发送到目标设备。
为什么仅仅依赖推送通知渠道会有限制?
- 选择加入要求:
推送通知需要用户选择接收。如果用户未选择接收或之后停用通知,他们将不会通过此渠道收到任何信息。
- 设备依赖性:
推送通知与设备相关。如果设备关机或断开网络连接,则通知将不会送达,直至设备恢复在线状态。
- 频道偏好:
用户接收通知的偏好各不相同。有些人可能更喜欢电子邮件或短信,而不是推送通知。Novu 支持在工作流、订阅者和全局级别设置渠道偏好,从而能够制定更符合用户偏好的定制化沟通策略。
- 关键信息传递:
对于关键通知(例如,帐户验证、密码重置),依赖推送通知等单一渠道可能会存在风险。如果错过或未收到推送通知,用户可能会错过重要信息。
Novu 允许将某些工作流程标记为关键,确保这些重要通知不会被取消订阅,但通过多种渠道通知仍然是有益的。
- 用户参与度:
不同渠道的参与度有所不同。推送通知可能适合即时更新,但发送新邮件或短信可能更适合更详细的信息,或者对于那些不太活跃的用户来说。
考虑到这些因素,使用多渠道通知方式是有利的,以确保更高的传递率,满足用户偏好,并确保关键信息可靠地传递。
常见问题解答
Firebase 云消息传递和 Firebase 消息传递之间有什么区别?
Firebase Cloud Messaging (FCM) 和 Firebase Messaging 之间实际上没有区别。
- Firebase Messaging 是一个较旧的术语,用于指代该服务。
- Firebase Cloud Messaging(FCM) 是当前更具体的名称。
Firebase 云消息传递中有哪两种消息类型?
Firebase 云消息传递 (FCM) 提供两种主要类型的消息:
-
通知消息:这些消息旨在直接显示给用户。它们通常包含标题、消息正文和图标,即使应用在后台运行,它们也会显示在用户的设备上。设备上的 FCM SDK 会自动处理通知。
-
数据消息:与通知消息不同,数据消息没有预定义格式,并且会静默地传递给应用。应用本身负责根据应用的逻辑解释和处理数据负载。这让您可以更灵活地向应用发送所需的任何类型的信息。
如何连接到 FCM?
连接到 FCM 涉及注册您的应用和设置 Firebase SDK。
具体步骤取决于您开发的平台(Android、Web 等)。
以下是总体概述:
-
在 Firebase 中注册您的应用:
- 转到 Firebase 控制台并创建一个项目或选择一个现有项目。
- 为您的项目启用 Firebase Cloud Messaging 服务。
-
设置 Firebase SDK:
- 下载适用于您的目标平台(Android、iOS、Web)的 Firebase SDK 并将其集成到您的应用项目中。
- 按照特定于平台的说明使用您的项目详细信息配置 SDK。
-
请求通知权限:
您需要在运行时向用户请求通知权限。
-
获取注册令牌:
- FCM SDK 为您的应用实例生成唯一的注册令牌。
- 您可以使用此令牌来识别您的应用程序并从您的服务器发送有针对性的消息。
以下是一些针对不同平台提供详细说明的资源:
- Android: https: //firebase.google.com/docs/cloud-messaging/android/client
- 网址: https ://firebase.google.com/docs/cloud-messaging/js/client
这些资源还涵盖了配置 Web 凭证和处理令牌更新等其他步骤。
什么是FCM诊断?
FCM 诊断是指对 FCM 系统内的消息传递问题进行故障排除的过程。这通常适用于使用 FCM 发送消息的移动应用。
FCM 提供诊断工具来检查传递状态并识别可能阻止消息到达目标设备的任何问题。
如何使用 FCM 向所有用户发送通知?
Firebase Cloud Messaging (FCM) 不直接支持向所有用户发送通知,因为为每个用户存储和管理单独的注册令牌是不可扩展的。
但是,有两种常见方法可以针对大量用户实现类似广播的通知:
- 主题消息传递:此方法涉及在 FCM 服务器上创建一个主题,然后要求所有用户在您的应用内订阅该主题。
一旦订阅,您发送到该主题的任何消息都将传送到所有订阅的设备。
如果您想发送与所有用户相关的一般公告或消息,这是一个很好的方法。
- 条件消息:这种方法更先进一些,可以让你根据特定条件定位用户。
您可以condition
在向 FCM 发送消息时使用该字段,并指定true
针对目标设备进行评估的逻辑表达式。
虽然它并不适合发送给所有用户,但对于覆盖根据特定标准定义的非常广泛的群体很有用。
例如,条件可以是'all' in topics
针对订阅任何主题的任何设备。
为什么使用 FCM 通知而不是 APNS?
实际上,您不能使用 FCM 通知来代替 APNS(Apple Push Notification Service)。FCM 实际上与 iOS 设备上的 APNS 协同工作。具体细节如下:
-
FCM(Firebase 云消息传递):这是 Google 推出的一款跨平台消息传递服务,可让您向 Android、iOS 甚至 Web 应用上的应用用户发送通知消息和数据消息。它充当消息发送的中心枢纽。
-
APNS(Apple Push Notification Service,苹果推送通知服务):这是 Apple 专有的服务,专门用于向 iOS 设备发送通知。FCM 依靠 APNS 向 iPhone 和 iPad 发送消息。
FCM 充当中间层,简化跨平台发送通知,同时仍在后台利用 iOS 设备的 APNS。
如何获取 FCM 设备令牌?
获取 Firebase 云消息传递 (FCM) 设备令牌的过程略有不同,具体取决于您开发的平台。
以下是 Android 和 iOS 的细分:
安卓:
-
将 Firebase 添加到您的项目:按照官方文档将 Firebase SDK 与您的 Android 项目集成。
-
在您的应用中请求令牌:在您的应用中,您可以使用该类
FirebaseInstanceId
来请求 FCM 设备令牌。
这是一种常见的方法:
```java
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String token = instanceIdResult.getToken();
// Send the token to your server for further processing
}
});
```
iOS:
-
CocoaPods 或手动集成:使用 CocoaPods 或手动链接将 Firebase SDK 与您的 iOS 项目集成。
-
请求权限和令牌:在您的 iOS 应用中,向用户请求接收通知的权限,然后获取 FCM 令牌。
这是一个简化的示例:
```swift
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
if granted {
Messaging.messaging().token { token, error in
if let error = error {
print("Error getting FCM token: \(error)")
} else if let token = token {
print("FCM token: \(token)")
// Send the token to your server for further processing
}
}
} else {
// Permission not granted
}
}
```
一般最佳实践:
- 建议在应用程序启动时以及每次更改时检索 FCM 令牌。
- 将 FCM 令牌发送到您的服务器以进行安全存储并与特定用户/设备关联。
- 实施一种机制来处理令牌检索失败或无效的情况。