使用FCM HTTP v1向多设备推送通知遇报错,求正确实现方法
FCM v1 API 多设备推送通知实现方法
你遇到的问题是因为FCM v1 API和旧版Legacy API的参数规则完全不同,registration_ids、to这些都是Legacy API的字段,v1版本不支持,所以会报未知字段错误。以下是两种用FCM token实现多设备推送的可行方案:
方案一:批量请求(Batch Requests)
适合给不同设备发送定制化内容,或者不想依赖主题的场景:
- 构造多个独立的单设备推送请求,每个请求的
message.token字段设置为单个设备的FCM token,符合v1 API的格式要求 - 将这些请求打包成批量请求,发送到FCM的批量端点
https://fcm.googleapis.com/batch - 批量请求的格式要求:
- 用自定义边界符分隔每个子请求
- 每个子请求需包含HTTP请求头和对应的JSON请求体
- 示例批量请求内容(简化版):
--batch_myboundary Content-Type: application/http Content-Transfer-Encoding: binary POST /v1/projects/你的项目ID/messages:send HTTP/1.1 Content-Type: application/json {"message":{"token":"DEVICE_TOKEN_1","notification":{"title":"测试通知","body":"设备1专属消息"}}} --batch_myboundary Content-Type: application/http Content-Transfer-Encoding: binary POST /v1/projects/你的项目ID/messages:send HTTP/1.1 Content-Type: application/json {"message":{"token":"DEVICE_TOKEN_2","notification":{"title":"测试通知","body":"设备2专属消息"}}} --batch_myboundary--
- 注意:单批次批量请求最多包含500个子请求,超过需拆分批次。
方案二:主题订阅推送
适合给大量设备发送相同内容的场景:
- 让所有目标设备在客户端订阅同一个自定义主题(比如
"app_updates"),各平台客户端有对应API(如Android端调用FirebaseMessaging.getInstance().subscribeToTopic("app_updates")) - 服务端调用v1 API时,请求体中
message.topic字段设置为该主题名,无需指定单个token - 示例请求体:
{ "message": { "topic": "app_updates", "notification": { "title": "全局通知", "body": "所有订阅该主题的设备都会收到此消息" } } }
关键注意事项
- FCM v1 API中,仅支持
message.token(单个设备)、message.topic、message.condition(条件推送)这些指定目标的字段,请勿使用Legacy API的registration_ids、to等字段 - 批量请求的Content-Type需设置为
multipart/mixed; boundary=你的边界符
内容的提问来源于stack exchange,提问作者Jacky Dev
相关产品推荐
相关产品推荐

