FCM Data Message数据长度限制:无法发送完整4096字节数据
FCM Data Message 数据长度限制疑问
我尝试在FCM Data Message的data字段中发送完整的4kB(4096字节)数据,但FCM API返回以下错误拒绝请求:
{ "error": { "code": 400, "message": "Request contains an invalid argument.", "status": "INVALID_ARGUMENT" } }
通过调整请求中字段数量做了实验,结果如下:
| Data JSON | FCM接受的最大长度(键总长度+值总长度) |
|---|---|
{"a": "value"} | 1 + 4050 = 4051 |
{"a": "value", "b": "value"} | 2 + 4043 = 4045 |
{"a": "value", "b": "value", "c": "value"} | 3 + 4036 = 4039 |
从表格能看出,最多只能发送4051字节而非4096字节,每新增一个字段,可发送的最大长度会减少6字节加上新字段的长度,压缩请求体中的JSON对FCM接受的最大长度无影响。现有两个疑问:
- 仅含单个字段时,缺失的45字节去向何处?
- 每个新字段占用的6字节用于什么?
问题解答
单个字段时缺失的45字节
FCM对Data Message的长度限制是基于整个消息的序列化后完整大小,而非单纯data字段内键值对的字节总和。这45字节是FCM内部封装消息时添加的固定元数据开销——包括消息标识头、设备路由标记、协议控制字段、加密相关结构等,这些是FCM传输和处理消息必须的基础内容,不会暴露给开发者,因此会从4096字节的总配额中预先扣除。新增字段占用的6字节
每新增一个键值对,额外消耗的6字节是JSON结构本身的语法开销:
- 键值对之间的分隔符
,(逗号加空格,共2字节) - 新键的引号包裹(如
"b":的前后引号,2字节) - 键与值之间的冒号加空格
:(2字节)
这三部分加起来正好6字节,FCM计算消息总长度时会将这些JSON语法字符计入配额,因此每多一个字段,可用的键值内容长度就会减少这6字节。
内容的提问来源于stack exchange,提问作者bianster
相关产品推荐
相关产品推荐

