使用XMPP服务器和Google Cloud Messaging(或较新的Firebase Cloud Messaging)进行推送通知的Android聊天应用程序

我正在开发一个安卓版的聊天应用程序。几周来,我一直在阅读有关XMPP和Google Cloud Messaging(以及Firebase Cloud Messaging)的信息,我仍然非常困惑。

目前,我已经在本地设置了一个XMPP服务器(Ejabberd),并使用Smack库成功地将我的Android应用程序连接到它。

据我所知,我需要使用GCM或更新的FCM进行推送通知,所以我已经在Google Cloud Platform中创建了一个项目。我的Android应用程序也可以使用Smack库连接到它(而不是直接连接到我的XMPP服务器)。在我的服务器中,我有一个小型Java应用程序,它也使用Smack库连接到GCM。

一切都很好,直到这里。我最大的困惑是:如何将我的XMPP服务器与GCM一起使用以进行推送通知?我为服务器端实现找到的每个文档,示例,指南,教程都只是告诉我如何连接到GCM,但没有一个告诉我如何将XMPP服务器与GCM结合使用。我错过了什么?我的Java应用程序只是连接到GCM,从GCM接收和发送消息,但我的XMPP服务器只是坐在那里无所事事。实际上,我的Android应用程序和服务器Java应用程序仅使用GCM,而不是我的XMPP服务器。

我希望有人能帮助我从整体上理解这一点,我显然缺少一些实现这个实现的关键要素。


答案 1

您需要将Ejabberd和FCM混合在一起,这就是所有大型聊天应用程序的做法。对于最基本的组件,有3个组件:通过XMPP连接到FCM的应用程序服务器,Ejabberd和您的客户端应用程序。

  1. 当应用程序处于前台时,您可以使用Smack库直接连接到您的Ejabberd服务器,发送消息,更改用户的状态等。在此期间,与 Ejabberd 的连接将保持不变。在此期间,您不会向上游发送消息!
  2. 用户离开你的应用后,你将关闭连接。用户现在被视为“离开”或“脱机”。
  3. 从现在开始,您的应用程序服务器将与FCM通信,以使用Smack库将下游消息发送到设备。
  4. 在客户端设备上:处理传入消息并显示通知。使用Android N,用户可以直接从通知中回复。我假设在这种情况下,您将使用FCM向应用程序服务器发送上游消息,因为在此期间,没有与Ejabberd服务器的活动连接。
  5. 用户点击通知后,应用将返回到前台,你将重新连接到 Ejabberd 并返回到步骤 1。

这是对实现所需内容所应具有的体系结构的最基本描述。


答案 2

这是一个示例 Java 项目,用于展示 Firebase Cloud Messaging (FCM) XMPP Connection Server。这个项目是一个非常简单的独立服务器,我开发它是一个更大项目的基础。它是我们必须在我们的环境中实现的应用程序服务器。此服务器使用 XMPP 协议通过 FCM CCS 服务器将数据发送到客户端应用程序。

https://github.com/carlosCharz/fcmxmppserver

我还在youtube上创建了一个视频,我解释了它的作用。

https://www.youtube.com/watch?v=PA91bVq5sHw

希望你觉得它有用。


推荐