更新 Google Play 服务至 8.4.0 后,推送通知自动显示问题。

8

我们使用GCM (Google Cloud Messaging) 来进行推送通知。当我们使用play-services:8.3.0时,一切正常。我们使用自己的接收器来处理推送通知。但是在升级到com.google.android.gms:play-services:8.4.0后,推送通知不再通过myGcmListenerService到达,而是直接显示在通知栏中。同时,日志中会出现以下错误:GcmAnalytics: Error while parsing timestamp in GCM event.

在8.3.0中,我们接收到的推送如下所示: Bundle[{gcm.notification.e=1, google.c.a.ts=234343426, gcm.notification.badge=1, gcm.notification.sound=default, gcm.notification.sound2=default, gcm.notification.body=John M @ Cords, Wires And Cable Ftu, gcm.notification.data={"name":"new_chat_message","message_id":490666,"channel_id":5366}, google.c.a.e=1, collapse_key=com.domain.app.debug}]

在8.4.0中,推送通知的格式如下: Bundle[{notification=Bundle[{sound2=default, e=1, body=John M @ Cords, Wires And Cable Rrr, data={"name":"new_chat_message","message_id":490641,"channel_id":5366}, badge=1, sound=default}], collapse_key=com.domain.app.debug}]


你有查看这两个版本之间是否有任何破坏性变更的文档吗? - saljuama
从文档中得知:通知 - GCM会代表客户端应用程序自动向最终用户设备显示消息。数据 - 客户端应用程序负责处理数据消息。问题在于,除了Android之外,我们还需要支持IOS客户端,因此我们需要将通知用于IOS(以处理系统推送),并将数据用于Android(以处理我们自己的推送)。 - Rafael
当我从8.3.0升级到8.4.0时,我看到了同样的问题,而且我根本不使用通知字段。看起来问题出在通知中的“e=1”字段上,因为这会导致我的8.4.0 Bundles包含一个我认为它们不应该有的通知包,我认为这就是问题所在。问题是,我无论如何都想不出“e=1”的含义,也不知道如何摆脱它,因为当它存在时,当我的应用程序不在前台时,GCM bundles永远不会传递到我的代码中。 - Codiak
1
我们还学到,如果您在推送中有“可用内容”,系统将强制自动显示它。您应该从推送消息中删除它。 - Rafael
1个回答

4
在您的服务器上,只需将notification字段中的e字段发送为zero
{
    "to": "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "content_available": true,
    "notification": {
        "e": 0
    },
    "data": {
        "key": "value"
    }
}

在安卓中,Bundle 的格式如下:

Bundle[{gcm.notification.e=0, key=value, ...}]

现在,如果您的应用程序处于后台状态,它将不会自动显示通知,并将在您的 GcmListenerService 中接收到数据包。

但是,如果您的应用程序同时具有通知和数据负载,并且该应用程序处于后台状态,则它将自行显示通知,如此处所述 here

同时具有通知和数据负载的混合消息

当接收到包含通知和数据负载的消息时,应用程序的行为取决于应用程序是否在后台或前台——基本上,它是否在接收时处于活动状态。

  • 当处于后台时,应用程序会在通知托盘中接收到通知负载,并仅在用户点击通知时处理数据负载。

  • 当处于前台时,您的应用程序将接收到同时具有两个负载的数据包。


很酷,非常好的发现!虽然这是一个未记录的功能,但我仍然有些不愿意在生产中使用它。如果在将来的某个版本中,这确实会在客户端生成通知(如果您在JSON中有任何类型的通知包,则可以从文档中预期),那么您可能会有一些需要此黑客的应用程序版本和一些需要您具有此黑客的应用程序版本。我在这个问题上与Google有一个未解决的错误,并正在努力获得某种答案,即使只是将其作为未来可靠的修复授权。 - Codiak
这对我不起作用。一个解决方法是删除 Android 设备的 notification 节点。https://dev59.com/-ZTfa4cB1Zd3GeqPW99J#38741956 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接