Firebase Cloud Messaging (FCM) — 是Google提供的跨平台推送通知和消息传递服务,适用于移动和Web应用程序。FCM确保服务器与客户端设备之间可靠的数据传输,无需维持永久网络连接。根据Firebase Documentation, 2026,每天通过FCM基础设施传输超过3000亿条消息。该服务既支持自动显示的notifications,也支持在后台隐蔽传输数据的data消息。
要点
Firebase Cloud Messaging — 是Google的云服务,提供应用程序服务器与客户端设备之间的推送通知和data消息传输。该服务取代了过时的Google Cloud Messaging (GCM),并成为Firebase生态系统中推送传递的标准解决方案。FCM支持Android、iOS、Web和Unity,提供独立于目标平台的统一发送接口。
该服务提供多种消息传递机制,每种机制解决不同的任务。Notification消息在接收时由系统自动显示——开发者无需编写代码来显示通知。Data消息以键值对形式传输任意payload,并在应用程序内部处理。组合消息同时包含可见和隐藏部分,实现最大灵活性。
实现自有推送服务器需要与每个设备保持TCP连接,这既低效又不安全。FCM使用Google统一基础设施,同时连接数十亿设备。该服务自动管理重试传递、消息队列和负载均衡,使开发者无需单独解决这些任务。
FCM架构由三个关键组件组成:提供商服务器(您的后端)、Firebase Cloud Messaging服务器和客户端应用程序。当服务器发送消息时,它首先进入FCM基础设施,由其路由到目标设备。如果设备离线,FCM将消息存储在队列中,待连接恢复后传递。
首次启动时,应用程序调用Firebase SDK,将设备注册到FCM服务并获取唯一的Registration Token。该令牌是约150个字符的字符串,标识特定设备上的特定应用程序实例。重新安装应用程序、清除数据或从备份恢复时,令牌可能会改变——开发者应通过onNewToken委托处理令牌更新。
当服务器通过FCM API发送请求时,消息经历多个阶段。接收和验证——FCM检查请求的正确性和目标设备的存在。队列——如果设备不可用,消息进入存储队列。路由——FCM确定最佳传递渠道(Wi-Fi或移动数据)。传递——系统将消息传递给目标应用程序。成功传递后,FCM向服务器返回消息标识符。
Firebase Cloud Messaging支持三种消息类型,每种在客户端有其处理特点。Notification消息由Android中的Google Play Services和iOS中的APNs系统服务处理,并自动显示为推送横幅。Data消息直接传递给应用程序,通过Android中的onMessageReceived和iOS中的application(_:didReceiveRemoteNotification:)回调处理。
Notification消息包含预定义字段:title、body、图片URL和通知声音。系统自动在系统托盘中创建并显示通知,即使应用程序在后台或已关闭。用户看到带有标题和文本的标准横幅,点击后应用程序以payload中传递的数据打开。如果应用程序处于活动状态,notification消息可以被拦截并在代码中处理。
Data消息是没有预定义字段的自定义键值对集合。系统不会自动处理payload——应用程序接收原始数据并可任意解释。Data消息用于后台数据同步、更新本地缓存、触发同步或在不显示通知的情况下传递命令。在Android中,data消息始终传递,即使应用程序已关闭或在后台。
FCM允许发送同时包含notification部分(用于显示)和data部分(用于处理)的消息。组合payload既包含预定义的notification字段,也包含任意的data键。系统从notification部分显示通知,data部分在打开时传递到应用程序的intent extras。这适用于需要向用户显示通知同时传递上下文以导航到特定屏幕的场景。
| 类型 | 自动显示 | 后台处理 | 示例 |
|---|---|---|---|
| Notification | 是,由系统 | 自动,无需代码 | 欢迎推送通知 |
| Data | 否 | 通过应用程序回调 | 后台数据同步 |
| 组合 | 是,notification部分 | 打开时data部分 | 通知 + 订单链接 |
在Android中集成FCM从通过应用程序级别的build.gradle文件连接Firebase SDK开始。添加依赖项和google-services.json文件后,应用程序自动获取通过FirebaseMessagingService回调传递的Registration Token。要接收通知,需要创建继承FirebaseMessagingService的服务并在AndroidManifest.xml中注册。
连接SDK后,Firebase自动生成设备令牌,无需额外代码。令牌可通过FirebaseMessaging.getInstance().token访问,它返回Task
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。
<!-- 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需要在Apple推送通知服务(APNs)端和Firebase Console中同时进行配置。与Android中FCM直接管理连接不同,在iOS中FCM使用APNs作为传输层。应用程序通过UIApplication.shared.registerForRemoteNotifications注册接收推送通知,Firebase SDK拦截接收到的device token并将其与FCM Registration Token关联。
FCM在iOS中工作需要将APNs密钥或证书上传到Firebase Console。APNs密钥——是一种无需证书的现代身份验证方法(Apple推荐)。密钥在Apple Developer Portal的Keys部分创建,并在Firebase Console的Cloud Messaging设置中上传。配置APNs后,应用程序通过UNUserNotificationCenter请求通知权限并通过APNs注册。
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。
请求正文包含包含消息信息的JSON对象:target(令牌、主题或条件)、notification(用于显示)和data(自定义payload)。通过Service Account JSON密钥进行身份验证,该密钥加载到服务器环境变量中。访问令牌通过google-auth-library库生成。Google建议使用Firebase Admin SDK来自动管理身份验证和重试。
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在Android上通过自己的Google基础设施工作,在iOS上使用APNs作为传输协议。FCM为两个平台提供统一API、自动离线消息存储和传递分析,而纯APNs不具备这些功能。
可以,通过Firebase Console的Cloud Messaging部分可以手动向选定设备、主题或受众群体发送通知。该功能适用于测试和一次性发送,但不能替代生产应用程序的服务器集成。
通过onNewToken(Android中的FirebaseMessagingService)或MessagingDelegate(iOS中的)订阅令牌更新。当令牌改变时,将新令牌发送到服务器并删除旧令牌。服务器应更新数据库并停止尝试向旧令牌发送。
FCM将消息在队列中存储最多28天,并在连接恢复后传递。对于notification消息,每个折叠组仅折叠最后一条消息。Data消息单独存储并按发送顺序传递,不进行折叠。
FCM完全免费,消息数量无限制。使用FCM在Spark计划或Blaze计划中均不收费。限制仅适用于payload大小:notification消息最多4 KB,data消息最多2 KB。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。