GCM/FCM中通知有效负载的大小

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)

希望这能回答您的问题。


Him*_*wal 0

我还对有效负载大小进行了实验,其大小仅接近 4 kb。

当我尝试发送大小为 7kb 的有效负载时,我在响应中显示了一个错误,提示消息太大。

因此,您可以解析响应代码并验证有效负载是否被谷歌服务器接受。