【问题标题】:How Does WhatsApp overcome the GCM Push notifications delay?WhatsApp 如何克服 GCM 推送通知延迟?
【发布时间】:2014-11-02 19:22:15
【问题描述】:

我正在尝试使用 GCM 服务,除了 GCM 推送通知或传递有效负载的长时间延迟之外,一切都很好……有时我的应用需要 5 分钟才能收到通知或有效负载。 我需要立即发货... 我知道 GCM 的角色,它会等到另一台设备上线,但在我的情况下,我持有两台设备并且它们都在线,但我收到了延迟通知!

WhatsApp(作为使用 GCM 的应用示例)如何克服这个问题.. 并立即发送?

[ 即(消息类型:打字,在线 - 最后一次看到)不能延迟...]


GCM 延迟推送是已知问题:this issue 我的问题是:其他使用 GCM 的应用程序如何克服这个问题

【问题讨论】:

标签: android google-cloud-messaging whatsapp


【解决方案1】:

大玩家

让我们从规模的角度关注 WhatsApp。他们的规模是全球性的,并且在市场份额方面是最大的之一。对于像这样的玩家来说,无论在什么情况下,都必须提供一致和流畅的用户体验。这意味着像我们这样的“小鱼开发商”被大鱼公司留下了预先定义的规则。有时,正是实现具有足够的挑战性,以至于很多小时候开发人员都不得不处理任何可用的

我想以 WhatsApp 的 Push Notification 为例进行说明。

首先,我们必须停止将推送通知与 Google 的服务(即 Google Play 服务)完全关联。没有 Google Play 服务的设备会不会收到推送通知?不,当然可以——尝试关注推送通知的核心机制

推送通知的工作原理 - 套接字!

与 HTTP 之类的协议相反,HTTP 采用客户端-服务器架构并且是单向协议(服务器无法自行发起通信),普通套接字可实现双向通信。

您想通过套接字实现自己的文件传输协议吗?你可以!

您想通过套接字实现自己的聊天协议吗?你可以!

您想通过套接字实现自己的推送通知协议吗?你可以!

套接字是通过网络进行通信的画布。你几乎可以做任何事情。我们个人在我们的组织中开发了一个自定义请求-响应协议。

多种实现

不要坚持使用默认的 GCM/FCM 通知消息协议或实现。您可以部署一种机制来维持与设备的持久套接字连接,并且可以监听服务器想要推送的任何内容。

  • WhatsApp 使用 GCM/FCM 及其专有的 XMPP 服务器实现推送通知
  • WhatsApp(和其他几个应用程序)依赖 GCM/FCM(作为选项 1 - 默认值),因为它在许多设备上作为系统应用程序存在,因此具有一种特殊状态,它被杀死的可能性很小与普通应用不同。
  • 对于没有播放服务的设备,依赖于您的自定义套接字连接。当 FCM 可用时,FCM 可能比套接字更受欢迎,但这些由您来管理。

来自 WhatsApp 的最新版本 (2.19.203):

请注意,存在 FCM 的相关权限。

疑似套接字实现: https://android.stackexchange.com/questions/43970/how-is-whatsapp-able-to-receive-messages-when-not-in-use

基于 XMPP 的推送通知

发件人,https://www.quora.com/Does-WhatsApp-use-GCM-to-exchange-messages

不,whatsapp 不使用 GCM[不完全正确]。它使用 XMPP 的修改版本 取而代之的是 FunXMPP。它更改消息帧中的 XML 关键字 节省带宽,因为它的用户主要是移动网络用户, 没有良好的互联网连接。可以找到替代品 这里:mgp25/Chat-API(虽然我不是作者)

他们甚至要求将他们使用的任何端口(自定义)列入白名单。

所以,WhatsApp 做到了。脸书做到了。谷歌做到了。很多这样的公司都是这样做的。您也可以(在一定程度上)使用 Ejjaberd、Openfire 或其他一些技术来实现它,并为其提供适当的客户端实现。

中文ROM

一些中国 ROM 更进一步,从根本上改变了 Android 中管理内存和进程的方式。例如,在 Oppo 中,如果应用程序没有打开自动启动,一旦你的应用程序被杀死,它就不会让你做任何事情。除了希望用户再次打开应用程序之外,不希望有任何体验。在这些情况下,这些原始设备制造商选择性地将 WhatsApp、Facebook、谷歌和其他玩家列入白名单。那么,谁受苦呢?

我们。期间。

【讨论】:

  • 正是我需要的。鼓舞人心的答案。谢谢楼主
【解决方案2】:

发送通知时,您可以将priority-parameter 设置为“高”。

来自文档:

默认情况下,消息以正常优先级发送。 普通优先级可优化客户端应用的电池消耗,除非需要立即交付,否则应使用此优先级。对于具有正常优先级的消息,应用可能会以未指定的延迟接收消息。

当消息以高优先级发送时,它会立即发送,并且该应用可以唤醒睡眠设备并打开与您的服务器的网络连接。

我知道这个答案来晚了,但是如果您仍然面临这个问题(或其他任何人),请告诉我它是否有帮助。

【讨论】:

  • 我现在在从服务器推送通知时使用高优先级。但是当手机处于睡眠模式时,通知仍然延迟或无法接收。你能给我建议吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2015-03-08
  • 1970-01-01
  • 2023-03-06
  • 2016-05-11
  • 1970-01-01
相关资源
最近更新 更多