FCM — 这是什么,Firebase Cloud Messaging在开发中的原则

作者: IT Sectr 发布日期: 2026-03-19 阅读时间: 8 分钟

FCM(Firebase Cloud Messaging)是Google提供的跨平台服务,用于在服务器和移动应用程序之间推送通知和传输数据。它通过统一的API支持Android、iOS和Web平台。据Firebase Documentation报道,FCM每天在全球处理超过10亿条消息。

主要内容

  • FCM — Google提供的用于发送推送通知和数据的跨平台服务
  • 架构 — 客户端获取注册令牌,服务器通过Firebase Connection Server发送消息
  • 消息类型 — notification(自动显示)和data(在应用程序中完全处理)
  • 提交 — FCM使用持久连接或优先级队列来保证提交
  • 集成 — 通过Firebase SDK连接,配置google-services.json和服务器配置

什么是FCM?

Firebase Cloud Messaging(FCM)是Google提供的一项云服务,能够可靠地将推送通知和数据消息发送到移动设备。它以前被称为Google Cloud Messaging(GCM),现在已成为Firebase生态系统中跨平台通知的主要工具。

FCM根据平台自动选择最佳提交渠道:在Android上使用自己的FCM连接,在iOS上使用APNS(通过FCM网关)。开发人员不需要实现两种不同的集成——FCM承担路由选择。

该服务提供统一的REST API和Admin SDK用于发送消息。这使得可以从服务器端发送通知,而无需绑定到接收方的特定平台。

FCM的主要功能

FCM支持多种提交模式:向特定设备发送单条消息、按主题(topic)群发和按条件(condition)分段发送。还可以定时发送和对通知内容进行A/B测试。

Firebase Cloud Messaging如何工作?

FCM的架构基于三个组件:客户端应用程序、Firebase Connection Server和应用程序服务器。客户端在启动时向FCM注册,并获取一个唯一的注册令牌——一个标识该应用程序的设备的字符串。

应用程序服务器向FCM REST API发送请求,指定接收方的令牌或主题。Firebase Connection Server使用持久XMPP连接或HTTP请求提交消息。如果设备离线,消息将被排队,并在连接恢复后提交。

FCM通过优先级队列和接收确认机制来保证提交。在Android上,消息在队列中保存最多28天,在iOS上最多4周(通过APNS)。期限过后,消息将被删除而不作通知。

FCM令牌的生命周期

注册令牌可能在以下情况下发生变化:恢复应用程序数据时、更新到新版本时或清除缓存时。应用程序应实现FirebaseMessagingService.onNewToken来处理令牌更新和与服务器同步。

FCM消息类型

FCM支持两种类型的负载:notification和data。每种类型确定消息在接收方设备上如何以及何时被处理。

参数NotificationData
自动显示是,如果应用程序在后台否,仅在应用程序中
处理系统——在后台;应用程序——在前台始终在应用程序中(onMessageReceived)
最大大小4 KB4 KB
自定义密钥只能使用预定义字段任意键值对
需要CollapseKey可选可选,用于分组

在实践中,如果应用程序需要在onMessageReceived中完全处理通知,建议使用data消息。Notification消息适合简单的场景,其中系统显示就足够了。

FCM和APNS:方法比较

FCM和APNS是两个主要的推送服务。FCM作为跨平台网关工作,APNS仅用于Apple生态系统。它们的主要差异在于架构、证书要求和路由机制。

  • 跨平台 — FCM支持Android、iOS、Web;APNS仅支持iOS、macOS、watchOS、tvOS
  • 认证 — FCM使用Server Key或OAuth 2.0;APNS使用证书或Token-based(p8 key)
  • 消息优先级 — FCM有normal/high;APNS有immediate/power-efficient consideration
  • 主题 — FCM支持立即订阅主题;APNS需要服务器逻辑

在FCM和直接APNS之间的选择取决于项目架构。对于跨平台应用程序,FCM是最优选择。对于仅iOS的项目,可以通过HTTP/2 API直接使用APNS。

什么时候选择FCM而不是直接APNS

当项目同时使用Android和iOS时,或者需要Firebase分析、A/B测试通知或主题而不需要服务器逻辑时,FCM是合理的选择。直接APNS更适合仅iOS的应用程序,这种应用具有最小的依赖性和严格的提交延迟要求。

在Android中集成FCM

要将FCM连接到Android应用程序,需要添加Firebase SDK并在项目根目录中配置google-services.json。注册令牌后,应用程序就可以通过FirebaseMessagingService接收消息。

kotlin
// build.gradle (Module)
dependencies {
    implementation("com.google.firebase:firebase-messaging:24.1.0")
}

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

class MyFirebaseMessagingService :
    FirebaseMessagingService() {

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

    override fun onMessageReceived(message: RemoteMessage) {
        message.notification?.let {
            showNotification(it.title, it.body)
        }
    }
}

配置后,应用程序在首次启动时自动获取FCM令牌。需要将该令牌发送到应用程序服务器,以便后续向此设备发送通知。

为FCM通知配置频道

在Android 8+上,在发送自动显示的FCM通知之前,需要创建NotificationChannel。FCM notification消息使用默认ID的频道,但建议在接收第一条消息时通过FirebaseMessagingService创建自己的频道。Data消息不需要频道——应用程序自己决定如何以及何时显示通知。

在iOS中集成FCM

在iOS上,FCM作为应用程序服务器和APNS之间的中介。Firebase从服务器接收消息,将其包装成APNS格式,并通过Apple网关发送。开发人员需要在Firebase控制台中配置APNS密钥或证书。

swift
import FirebaseMessaging
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        FirebaseApp.configure()
        UNUserNotificationCenter.current().delegate = self

        Messaging.messaging().delegate = self
        return true
    }
}

extension AppDelegate: MessagingDelegate {
    func messaging(
        _ messaging: Messaging,
        didReceiveRegistrationToken fcmToken: String?
    ) {
        UserDefaults.standard.set(fcmToken, forKey: "fcm_token")
    }
}

在iOS上,向APNS注册是异步进行的。FCM SDK自动获取APNS令牌并将其传递给Firebase服务器。didReceiveRegistrationToken在获取新FCM令牌时触发,该令牌将APNS令牌与项目标识符组合在一起。

检查提交状态

FCM提供Firebase控制台用于监控提交:发送、接收和显示的通知数量。还可以通过Firebase Cloud Functions使用状态回调来跟踪服务器端的提交错误。主要指标:impressions(显示次数)和opens(打开次数)。

FCM最佳实践

在使用FCM时,为每个场景选择正确的消息类型很重要。对于自动显示的简单通知,使用notification消息。对于应用程序需要在显示之前处理数据的情况,使用data消息。混合类型(notification + data)仅在数据需要用于分析而非改变通知内容时推荐使用。

集中管理令牌。将当前令牌存储在服务器的表中,与用户和平台关联。实现清除过期令牌的机制:在NotRegistered或InvalidRegistration错误时,从数据库中删除令牌。令牌很少变化,但清除它们是FCM支持的必要环节。

使用折叠键(collapseKey)来分组消息。如果您发送多条相同类型的通知(例如“汇率更新”),请设置相同的collapseKey。FCM将只提交该组中的最后一条消息,这样可以减少设备负荷,并避免用户被大量通知骚扰。

通过Firebase Console和Cloud Functions监控提交。FCM分析显示发送、接收和显示的通知数量。如果显示率低于70%,请检查Android上的频道设置和iOS上的权限。低提交率通常与禁用的频道或禁止通知有关。第五:使用Firebase A/B测试来优化通知文本和发送时间——根据Firebase数据,这可以将打开转化率提高15–25%。

常见问题

FCM和GCM有什么区别?

FCM是GCM(Google Cloud Messaging)的演化升级。FCM提供通过Firebase Console简化的配置、内置分析、主题和Web Push支持。GCM已于2019年4月正式关闭,所有项目必须迁移到FCM。

通过FCM可以免费发送多少条消息?

Firebase Cloud Messaging是一项免费服务,没有消息数量限制。仅在使用其他Firebase服务(如Cloud Functions或Firestore)时才会收费。FCM不需要Spark或Blaze订阅来基本发送通知。

为什么FCM令牌可能会变化?

FCM令牌在以下情况下会变化:从备份恢复应用程序、清除应用程序数据、重新安装、更新到新版本并更改Sender ID。始终在FirebaseMessagingService中处理onNewToken,以将新令牌发送到服务器。

FCM在中国能用吗?

Google FCM在中国境内被封锁。在中国提交通知使用替代服务:Huawei Push Kit、MiPush(Xiaomi)、Oppo Push、Vivo Push。对于跨平台提交,使用多提供商服务,如Getui。

如何检查FCM是否配置正确?

使用内置的Firebase控制台:选择“Cloud Messaging”——“Send Test Message”。输入测试令牌并发送notification消息。设备上应该会显示通知。您还可以监控FirebaseMessagingService.onMessageReceived日志。

总结

  • FCM — Google提供的用于推送通知和数据提交的跨平台云服务
  • 令牌 — 用于目标发送消息的唯一设备标识符
  • Notification — 系统在后台模式下自动显示的消息类型
  • Data — 仅在应用程序中处理的完整负载消息类型
  • 主题 — 通过订阅主题进行群发的机制,无需在服务器上存储令牌
  • APNS网关 — 对于iOS,FCM作为中介,通过APNS传送消息
  • 免费 — FCM不对发送的消息数量收费

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

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

讨论项目

另请阅读