jor*_*sso 12 android google-cloud-messaging firebase-cloud-messaging
此问题最初是指Google Cloud Messaging(GCM),但现在它也适用于取代GCM的新Firebase云消息传递(FCM).
我想知道如何在包含"通知"字典时计算GCM有效负载的大小.
我一直在尝试针对Android的Google Cloud Messaging服务.文档的某些部分说您可以发送最多4KB的数据,并在此处说"通知消息最多可以有2kb的负载".
做一些测试我可以发送带有4KB数据的"数据"有效载荷的消息,服务器接受它们没有按预期的错误.
但是,使用"通知"有效负载我发现我可以发送超过2KB数据的消息,并且服务器没有返回错误.我预计这样的消息会太大了.
我发现"通知"有效负载与"数据"有效负载共享允许的4KB,但不是以相同的方式.在"数据"有效负载中,您可以通过添加键和值的大小来计算大小."通知"有效负载占用的空间大于密钥大小和包含的值.
当包含"通知"字典时,如何预先计算有效载荷的大小?
Era*_*ran 17
我尝试了新的FCM服务的有效载荷大小.
对于包含"数据"字典而没有"通知"字典的消息,我设法发送最多4096个字符(计算所有键和值的长度).
对于包含"通知"字典而没有"数据"字典的消息,以及包含"通知"字典和"数据"字典的消息,我设法发送最多4062个字符.我无法弄清楚剩余的34个字符是如何计算的.
这意味着将"通知"有效负载限制为2K的文档不正确.你可以发送接近4K.
现在,阅读FCM的最新文档,我发现Message类型的文档说:
通知消息包含一组预定义的用户可见键.相反,数据消息仅包含用户定义的自定义键值对.通知消息可以包含可选的数据有效负载.两种消息类型的最大有效负载均为4KB,但从Firebase控制台发送消息时除外,该控制台强制执行1024个字符的限制.
另一方面,"MessageTooBig"错误的描述说:
检查消息中包含的有效负载数据的总大小是否不超过FCM限制:大多数消息为4096字节,对于主题消息为2048字节.这包括键和值.
我测试的消息不是主题消息,因此根据两个引号,它们不应限于2K.
因此,根据当前文档的有效负载限制是4K(可能除了主题消息之外,我没有测试).
小智 8
FCM 添加前缀gcm.notification。对于通知负载中的每个键。
以下有效负载的计算示例:
"to":"cgOtBDOGIEc:APA91bGrjdPtrnGr0sIl4c66Z3Xp-JTzUasIN5TzWy7DtNUf-BlGvF64iNOXFN68zFC6oTYHJbP6eQgzIZICcsmIUG-NP5cIXf8EyPNiIAvOFU27XDKFbI2vowMjsNmZQdmh",
"notification":{
"title":"Testing title from postman!",
"body":"Testing body from postman!",
"sound":"default",
"tickerText":"This is ticker text"
},
"data" : {
"Nick" : "Mario Test",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
Run Code Online (Sandbox Code Playgroud)
对于上述有效负载,
总长度=(通知负载+数据负载)的长度
数据负载长度 = [ 键长度 + 值长度 ] = [ Nick + body + Room ] 的字节长度 + [Mario Test + 伟大的比赛 + BulgariaVSDenmark ] 的字节长度 = 12 + 39 = 51
为了计算通知负载,每个键都必须以 gcm.notification 为前缀。
对于通知有效负载的每个键,firebase 内部都会添加 gcm.notification。作为前缀,并考虑该前缀来计算长度。
Length of Notification Payload = [ no.of keys * length of (gcm.notification.) + length of keys + length of values ]
= 4*17 + length of bytes of [ title + body + sound + tickerText ] + length of bytes of [ Testing title from postman! + Testing body from postman! + default + This is ticker text ]
= 68 + 24 +79
= 171 bytes
Total length of the payload = 51 + 171 = 222 bytes.
Run Code Online (Sandbox Code Playgroud)
希望这能回答您的问题。
我还对有效负载大小进行了实验,其大小仅接近 4 kb。
当我尝试发送大小为 7kb 的有效负载时,我在响应中显示了一个错误,提示消息太大。
因此,您可以解析响应代码并验证有效负载是否被谷歌服务器接受。
| 归档时间: |
|
| 查看次数: |
21667 次 |
| 最近记录: |