iOS端firebase_messaging无法获取collapseKey:求通知替换方案及请求排查
关于FCM通知折叠ID未映射及通知替换的问题
发送的FCM Payload
{ "message": { "token": "DEVICE_TOKEN", "apns": { "headers": { "apns-priority": "5", "apns-push-type": "alert", "apns-collapse-id": "113" }, "payload": { "aps": { "alert": { "title": "Brand new title", "body": "Brand new text" }, "category": "XYZ_CATEGORY" } } } } }
Flutter后台远程通知处理器代码
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage rMessage) async { await Firebase.initializeApp(); debugPrint('Handling a background message ${rMessage.toMap()}'); }
控制台输出结果
{ "senderId": null, "category": "XYZ_CATEGORY", "collapseKey": null, "contentAvailable": true, "data": {}, "from": null, "messageId": 1706272050712326, "messageType": null, "mutableContent": false, "notification": { "title": "Brand new title", "titleLocArgs": [], "titleLocKey": null, "body": "Brand new text", "bodyLocArgs": [], "bodyLocKey": null, "android": null, "apple": { "badge": null, "subtitle": null, "subtitleLocArgs": [], "subtitleLocKey": null, "imageUrl": null, "sound": null }, "web": null }, "sentTime": null, "threadId": null, "ttl": null }
可以看到apns-collapse-id并未映射到collapseKey字段,现提出两个问题:
- 无法获取
collapseKey时,如何替换现有通知? - 我的请求是否存在遗漏?
问题解答
2. 请求是否存在遗漏?
是的,请求有遗漏。FCM的collapseKey是顶层字段,不属于apns配置的一部分。你仅在APNS headers中设置了apns-collapse-id,但没有在FCM message的顶层添加collapseKey字段,所以Flutter端的RemoteMessage中collapseKey才会是null。apns-collapse-id是给苹果APNS服务器使用的标识,FCM不会自动将其映射到自身的collapseKey字段。
1. 无法获取collapseKey时,如何替换现有通知?
有两种可行方案:
方案一:补全FCM请求字段
在FCM message的顶层添加collapseKey字段,值和apns-collapse-id保持一致(比如'113')。修改后的Payload如下:{ "message": { "token": "DEVICE_TOKEN", "collapseKey": "113", "apns": { "headers": { "apns-priority": "5", "apns-push-type": "alert", "apns-collapse-id": "113" }, "payload": { "aps": { "alert": { "title": "Brand new title", "body": "Brand new text" }, "category": "XYZ_CATEGORY" } } } } }这样Flutter端就能正确拿到
collapseKey,同时APNS也能正常折叠替换通知。方案二:本地手动管理通知
如果不想修改FCM请求,可以借助第三方通知插件(比如flutter_local_notifications)手动处理通知的创建与更新:- 把通知的
category(比如你这里的'XYZ_CATEGORY')或者自定义的data字段作为唯一标识; - 收到新通知时,遍历本地已展示的通知,找到同标识的通知并调用插件的更新接口替换内容;
- 这种方式需要你自己维护通知的状态,不再依赖FCM自动展示通知。
- 把通知的
内容的提问来源于stack exchange,提问作者thewebjackal
相关产品推荐
相关产品推荐

