应用程序客户端如何处理传入的即时消息和通知?

How are incoming instant messages and notifications handled by app clients?

我对处理来自 Telegram 和 WhatsApp 等即时消息应用程序的入站消息和通知背后的过程很感兴趣。我对推送协议很熟悉,但是我很好奇即时通讯应用程序是如何实现接收部分的。

首先,来自 WhatsApp 和 Telegram 等服务的即时消息是以推送通知的形式接收的,还是 duplication/redundancy 导致 推送通知之间的某种竞争条件proper 交给应用程序实例服务工作者, 消息 交给应用程序实例 foreground/main 进程?或者,即时消息是否始终且仅作为推送通知发送,至少对于来自 Whatsapp 等应用程序的端到端加密消息?

其次,在上述duplication/redundancy假设下,service worker处理的通知是否传递到app实例,然后在target中显示聊天,还是通知 已丢弃 以支持应用程序实例从 Telegram/Whatsapp 服务器获取原始消息? (我想到了这样一种情况,需要这样做才能确保向发件人提供可靠的消息已收到确认信息。)

实际上这是一个棘手的问题,因为像 Telegram 和 WhatsApp 这样的应用程序可能有一些多案例处理逻辑,非常复杂的逻辑。

但根据我的想象和在我的一些聊天应用程序中实际使用的是以下内容:

  • 某些实时协议用于消息传递。 Telegram 使用自己的专有协议,WhatsApp 使用 XMPP。
  • 当双方(发件人和收件人)在线时,将传送实时 XMPP 消息。主要且通常情况下,应用程序与聊天服务器有持久的 TCP/TLS/WSS 连接,主要是在用户使用它时。
  • 当收件人不在线(未连接到聊天服务器)时,例如不使用应用程序(应用程序处于 background/suspended 模式)然后将发送推送通知。这只是为了通知用户有一条新消息。然后用户(收件人)打开应用程序并接收真实消息(通过实时 XMPP 连接)或通过 REST/HTTP API.
  • 与服务器同步

所以没有任何重复,因为推送只是为了在用户不在应用程序中时通知用户有一条新消息。