You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段,现提出两个问题:

  1. 无法获取collapseKey时,如何替换现有通知?
  2. 我的请求是否存在遗漏?

问题解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:53