FCM(Firebase Cloud Messaging)是Google提供的跨平台服务,用于在服务器和移动应用程序之间推送通知和传输数据。它通过统一的API支持Android、iOS和Web平台。据Firebase Documentation报道,FCM每天在全球处理超过10亿条消息。
主要内容
Firebase Cloud Messaging(FCM)是Google提供的一项云服务,能够可靠地将推送通知和数据消息发送到移动设备。它以前被称为Google Cloud Messaging(GCM),现在已成为Firebase生态系统中跨平台通知的主要工具。
FCM根据平台自动选择最佳提交渠道:在Android上使用自己的FCM连接,在iOS上使用APNS(通过FCM网关)。开发人员不需要实现两种不同的集成——FCM承担路由选择。
该服务提供统一的REST API和Admin SDK用于发送消息。这使得可以从服务器端发送通知,而无需绑定到接收方的特定平台。
FCM支持多种提交模式:向特定设备发送单条消息、按主题(topic)群发和按条件(condition)分段发送。还可以定时发送和对通知内容进行A/B测试。
FCM的架构基于三个组件:客户端应用程序、Firebase Connection Server和应用程序服务器。客户端在启动时向FCM注册,并获取一个唯一的注册令牌——一个标识该应用程序的设备的字符串。
应用程序服务器向FCM REST API发送请求,指定接收方的令牌或主题。Firebase Connection Server使用持久XMPP连接或HTTP请求提交消息。如果设备离线,消息将被排队,并在连接恢复后提交。
FCM通过优先级队列和接收确认机制来保证提交。在Android上,消息在队列中保存最多28天,在iOS上最多4周(通过APNS)。期限过后,消息将被删除而不作通知。
注册令牌可能在以下情况下发生变化:恢复应用程序数据时、更新到新版本时或清除缓存时。应用程序应实现FirebaseMessagingService.onNewToken来处理令牌更新和与服务器同步。
FCM支持两种类型的负载:notification和data。每种类型确定消息在接收方设备上如何以及何时被处理。
| 参数 | Notification | Data |
|---|---|---|
| 自动显示 | 是,如果应用程序在后台 | 否,仅在应用程序中 |
| 处理 | 系统——在后台;应用程序——在前台 | 始终在应用程序中(onMessageReceived) |
| 最大大小 | 4 KB | 4 KB |
| 自定义密钥 | 只能使用预定义字段 | 任意键值对 |
| 需要CollapseKey | 可选 | 可选,用于分组 |
在实践中,如果应用程序需要在onMessageReceived中完全处理通知,建议使用data消息。Notification消息适合简单的场景,其中系统显示就足够了。
FCM和APNS是两个主要的推送服务。FCM作为跨平台网关工作,APNS仅用于Apple生态系统。它们的主要差异在于架构、证书要求和路由机制。
在FCM和直接APNS之间的选择取决于项目架构。对于跨平台应用程序,FCM是最优选择。对于仅iOS的项目,可以通过HTTP/2 API直接使用APNS。
当项目同时使用Android和iOS时,或者需要Firebase分析、A/B测试通知或主题而不需要服务器逻辑时,FCM是合理的选择。直接APNS更适合仅iOS的应用程序,这种应用具有最小的依赖性和严格的提交延迟要求。
要将FCM连接到Android应用程序,需要添加Firebase SDK并在项目根目录中配置google-services.json。注册令牌后,应用程序就可以通过FirebaseMessagingService接收消息。
// 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令牌。需要将该令牌发送到应用程序服务器,以便后续向此设备发送通知。
在Android 8+上,在发送自动显示的FCM通知之前,需要创建NotificationChannel。FCM notification消息使用默认ID的频道,但建议在接收第一条消息时通过FirebaseMessagingService创建自己的频道。Data消息不需要频道——应用程序自己决定如何以及何时显示通知。
在iOS上,FCM作为应用程序服务器和APNS之间的中介。Firebase从服务器接收消息,将其包装成APNS格式,并通过Apple网关发送。开发人员需要在Firebase控制台中配置APNS密钥或证书。
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时,为每个场景选择正确的消息类型很重要。对于自动显示的简单通知,使用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(Google Cloud Messaging)的演化升级。FCM提供通过Firebase Console简化的配置、内置分析、主题和Web Push支持。GCM已于2019年4月正式关闭,所有项目必须迁移到FCM。
Firebase Cloud Messaging是一项免费服务,没有消息数量限制。仅在使用其他Firebase服务(如Cloud Functions或Firestore)时才会收费。FCM不需要Spark或Blaze订阅来基本发送通知。
FCM令牌在以下情况下会变化:从备份恢复应用程序、清除应用程序数据、重新安装、更新到新版本并更改Sender ID。始终在FirebaseMessagingService中处理onNewToken,以将新令牌发送到服务器。
Google FCM在中国境内被封锁。在中国提交通知使用替代服务:Huawei Push Kit、MiPush(Xiaomi)、Oppo Push、Vivo Push。对于跨平台提交,使用多提供商服务,如Getui。
使用内置的Firebase控制台:选择“Cloud Messaging”——“Send Test Message”。输入测试令牌并发送notification消息。设备上应该会显示通知。您还可以监控FirebaseMessagingService.onMessageReceived日志。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。