Firebase Cloud Messaging:是什么、工作原理与推送通知

作者: IT Sectr 发布日期: 2026-04-29 阅读时间: 9 分钟

Firebase Cloud Messaging (FCM) — 是Google提供的跨平台推送通知和消息传递服务,适用于移动和Web应用程序。FCM确保服务器与客户端设备之间可靠的数据传输,无需维持永久网络连接。根据Firebase Documentation, 2026,每天通过FCM基础设施传输超过3000亿条消息。该服务既支持自动显示的notifications,也支持在后台隐蔽传输数据的data消息。

要点

  • FCM — Google提供的免费推送通知服务,通过统一API和Firebase Console支持Android、iOS和Web。
  • 消息类型 — notification消息由系统自动显示,data消息允许发送任意JSON并在应用程序中处理。
  • 设备令牌 — 每个应用程序获得唯一的Registration Token,服务器用它来定向发送推送通知。
  • 传递优先级 — normal和high优先级决定省电模式下的系统行为:high消息将设备从Doze模式唤醒。
  • 主题和组 — FCM支持订阅主题进行群发,以及Device Groups向一个用户的多个设备发送。

什么是Firebase Cloud Messaging

Firebase Cloud Messaging — 是Google的云服务,提供应用程序服务器与客户端设备之间的推送通知和data消息传输。该服务取代了过时的Google Cloud Messaging (GCM),并成为Firebase生态系统中推送传递的标准解决方案。FCM支持Android、iOS、Web和Unity,提供独立于目标平台的统一发送接口。

FCM的主要功能

该服务提供多种消息传递机制,每种机制解决不同的任务。Notification消息在接收时由系统自动显示——开发者无需编写代码来显示通知。Data消息以键值对形式传输任意payload,并在应用程序内部处理。组合消息同时包含可见和隐藏部分,实现最大灵活性。

相比自有解决方案的优势

实现自有推送服务器需要与每个设备保持TCP连接,这既低效又不安全。FCM使用Google统一基础设施,同时连接数十亿设备。该服务自动管理重试传递、消息队列和负载均衡,使开发者无需单独解决这些任务。

Firebase Cloud Messaging如何工作

FCM架构由三个关键组件组成:提供商服务器(您的后端)、Firebase Cloud Messaging服务器和客户端应用程序。当服务器发送消息时,它首先进入FCM基础设施,由其路由到目标设备。如果设备离线,FCM将消息存储在队列中,待连接恢复后传递。

设备注册和获取令牌

首次启动时,应用程序调用Firebase SDK,将设备注册到FCM服务并获取唯一的Registration Token。该令牌是约150个字符的字符串,标识特定设备上的特定应用程序实例。重新安装应用程序、清除数据或从备份恢复时,令牌可能会改变——开发者应通过onNewToken委托处理令牌更新。

消息生命周期

当服务器通过FCM API发送请求时,消息经历多个阶段。接收和验证——FCM检查请求的正确性和目标设备的存在。队列——如果设备不可用,消息进入存储队列。路由——FCM确定最佳传递渠道(Wi-Fi或移动数据)。传递——系统将消息传递给目标应用程序。成功传递后,FCM向服务器返回消息标识符。

FCM中的消息类型

Firebase Cloud Messaging支持三种消息类型,每种在客户端有其处理特点。Notification消息由Android中的Google Play Services和iOS中的APNs系统服务处理,并自动显示为推送横幅。Data消息直接传递给应用程序,通过Android中的onMessageReceived和iOS中的application(_:didReceiveRemoteNotification:)回调处理。

Notification消息

Notification消息包含预定义字段:title、body、图片URL和通知声音。系统自动在系统托盘中创建并显示通知,即使应用程序在后台或已关闭。用户看到带有标题和文本的标准横幅,点击后应用程序以payload中传递的数据打开。如果应用程序处于活动状态,notification消息可以被拦截并在代码中处理。

Data消息

Data消息是没有预定义字段的自定义键值对集合。系统不会自动处理payload——应用程序接收原始数据并可任意解释。Data消息用于后台数据同步、更新本地缓存、触发同步或在不显示通知的情况下传递命令。在Android中,data消息始终传递,即使应用程序已关闭或在后台。

组合消息

FCM允许发送同时包含notification部分(用于显示)和data部分(用于处理)的消息。组合payload既包含预定义的notification字段,也包含任意的data键。系统从notification部分显示通知,data部分在打开时传递到应用程序的intent extras。这适用于需要向用户显示通知同时传递上下文以导航到特定屏幕的场景。

类型自动显示后台处理示例
Notification是,由系统自动,无需代码欢迎推送通知
Data通过应用程序回调后台数据同步
组合是,notification部分打开时data部分通知 + 订单链接

在Android中配置FCM

在Android中集成FCM从通过应用程序级别的build.gradle文件连接Firebase SDK开始。添加依赖项和google-services.json文件后,应用程序自动获取通过FirebaseMessagingService回调传递的Registration Token。要接收通知,需要创建继承FirebaseMessagingService的服务并在AndroidManifest.xml中注册。

初始化和获取令牌

连接SDK后,Firebase自动生成设备令牌,无需额外代码。令牌可通过FirebaseMessaging.getInstance().token访问,它返回Task。为了跟踪令牌更新,在服务中重写onNewToken方法。令牌必须传递给提供商服务器,以便服务器能够向此设备发送推送通知。

kotlin
class MyFirebaseMessagingService :
    FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        sendTokenToServer(token)
    }

    override fun onMessageReceived(
        message: RemoteMessage
    ) {
        val data = message.data
        val title = "新消息"
        val body = data["body"] ?: ""
        showNotification(title, body)
    }
}

在清单中注册服务

接收FCM消息的服务必须在AndroidManifest.xml中使用相应的intent-filter注册。添加service标签,包含INTERNET权限并指定action。如果不注册服务,消息将不会在后台传递给应用程序。在Android 13+中显示通知需要运行时权限POST_NOTIFICATIONS。

xml
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name=
    "android.permission.POST_NOTIFICATIONS" />

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name=
            "com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

在iOS中配置FCM

在iOS中集成FCM需要在Apple推送通知服务(APNs)端和Firebase Console中同时进行配置。与Android中FCM直接管理连接不同,在iOS中FCM使用APNs作为传输层。应用程序通过UIApplication.shared.registerForRemoteNotifications注册接收推送通知,Firebase SDK拦截接收到的device token并将其与FCM Registration Token关联。

配置APNs和注册通知

FCM在iOS中工作需要将APNs密钥或证书上传到Firebase Console。APNs密钥——是一种无需证书的现代身份验证方法(Apple推荐)。密钥在Apple Developer Portal的Keys部分创建,并在Firebase Console的Cloud Messaging设置中上传。配置APNs后,应用程序通过UNUserNotificationCenter请求通知权限并通过APNs注册。

swift
import Firebase
import UserNotifications

class AppDelegate: NSObject, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions
        launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        FirebaseApp.configure()
        UNUserNotificationCenter.current()
            .requestAuthorization(options: [.alert, .sound, .badge])
        application.registerForRemoteNotifications()
        return true
    }

    func application(
        _ application: UIApplication,
        didRegisterForRemoteNotificationsWithDeviceToken
        deviceToken: Data
    ) {
        Messaging.messaging()
            .apnsToken = deviceToken
    }
}

处理传入通知

为了处理接收到的通知,需要实现UNUserNotificationCenter委托。willPresent方法在应用程序活动时收到通知时调用——此处可以显示自定义应用内通知或忽略系统横幅。didReceive方法在用户点击通知时调用——此处执行到相应屏幕的导航。对于data消息,使用MessagingDelegate委托,它在后台接收FCM消息时获取payload。

从服务器发送消息

服务器端发送FCM消息通过HTTP v1 API Firebase Cloud Messaging或过时的Firebase Cloud Messaging API完成。HTTP v1 API是推荐的方式,使用通过Service Account的OAuth 2.0身份验证,并支持FCM所有现代功能,包括传递分析和A/B通知测试。请求通过POST方法发送到端点https://fcm.googleapis.com/v1/projects/{project_id}/messages:send。

HTTP v1请求格式

请求正文包含包含消息信息的JSON对象:target(令牌、主题或条件)、notification(用于显示)和data(自定义payload)。通过Service Account JSON密钥进行身份验证,该密钥加载到服务器环境变量中。访问令牌通过google-auth-library库生成。Google建议使用Firebase Admin SDK来自动管理身份验证和重试。

js
const admin = require("firebase-admin")

const serviceAccount = require("./serviceAccountKey.json")

admin.initializeApp({ credential: admin.credential.cert(serviceAccount) })

const message = {
    token: "device_registration_token",
    notification: { title: "20%折扣", body: "所有服务今日" },
    data: { screen: "promo", promoId: "324" },
    android: { priority: "high" },
    apns: { payload: { aps: { sound: "default" } } }
}

admin.messaging().send(message)
    .then(response => {
        console.log("发送成功:", response)
    })
    .catch(error => {
        console.log("发送错误:", error)
    })

主题和群发

为了向用户组发送通知,FCM支持订阅主题。主题(topic)——是一个命名的频道,客户端应用程序通过FirebaseMessaging.getInstance().subscribeToTopic()订阅。服务器可以向主题发送消息,它将传递给所有订阅的设备。主题适用于新闻简报、促销通知和事件推送。对于更精确的细分,基于多个主题使用逻辑运算符的条件(conditions)。

常见问题

FCM和APNs有什么区别?

FCM在Android上通过自己的Google基础设施工作,在iOS上使用APNs作为传输协议。FCM为两个平台提供统一API、自动离线消息存储和传递分析,而纯APNs不具备这些功能。

可以在没有服务器的情况下发送FCM消息吗?

可以,通过Firebase Console的Cloud Messaging部分可以手动向选定设备、主题或受众群体发送通知。该功能适用于测试和一次性发送,但不能替代生产应用程序的服务器集成。

如果设备令牌改变怎么办?

通过onNewToken(Android中的FirebaseMessagingService)或MessagingDelegate(iOS中的)订阅令牌更新。当令牌改变时,将新令牌发送到服务器并删除旧令牌。服务器应更新数据库并停止尝试向旧令牌发送。

FCM如何处理离线设备?

FCM将消息在队列中存储最多28天,并在连接恢复后传递。对于notification消息,每个折叠组仅折叠最后一条消息。Data消息单独存储并按发送顺序传递,不进行折叠。

使用Firebase Cloud Messaging需要多少费用?

FCM完全免费,消息数量无限制。使用FCM在Spark计划或Blaze计划中均不收费。限制仅适用于payload大小:notification消息最多4 KB,data消息最多2 KB。

总结

  • Firebase Cloud Messaging — Google的跨平台推送通知服务,通过统一API支持Android、iOS、Web和Unity。
  • FCM架构由提供商服务器、Firebase基础设施和客户端应用程序组成,通过Google全球网络确保可靠的消息传递。
  • 三种消息类型 — notification(自动显示)、data(无UI的任意payload)和组合(同一消息中的两种类型)。
  • Android中的FCM通过FirebaseMessagingService使用自有连接工作,而iOS中使用APNs作为传输,通过MessagingDelegate拦截令牌。
  • HTTP v1 API推荐用于服务器端发送,使用通过Service Account的OAuth 2.0身份验证并支持传递分析。
  • 主题允许向订阅者组发送消息,条件(conditions)允许组合多个主题进行精确细分。
  • FCM免费,消息数量无限制,离线消息存储最多28天,最大payload大小4 KB。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读