【问题标题】:One to One Android Chat using Firebase使用 Firebase 的一对一 Android 聊天
【发布时间】:2016-12-26 01:47:08
【问题描述】:

我需要澄清一下。

我正在使用 Firebase 实时数据库。

现在我要在两个安卓设备之间实现实时聊天。我还需要推送通知。

所以,基于实时数据库的解决方案是放弃,因为如果应用没有运行,它不会处理onChildAdded事件。

我阅读了文档,我可以使用从设备到服务器的上游消息来实现我的目标。

现在,还写到我们需要一个应用服务器。

我只是想澄清一下应用服务器(XMPP或HTTP)的需求,即设备A发送的消息m1的整个流程,以及设备B上的通知。

在我看来,应用服务器应该充当中间人,所以:

A ---> XMPP 服务器 ---> FCM

FCM ---> XMPP 服务器 ---> B

这是流量吗? 在文档上,我不明白我是否正确。 如果是这样,我如何将消息从 FCM 发送回 XMPP 服务器? 通知消息是从 FCM 发送到客户端还是从 XMPP Server 发送的?

请有人澄清一下。

我想到的其他解决方案: 由于我发现了非常强大的 firebase 实时数据库,我认为这些解决方案可以解决这个问题:

  1. 创建一个正在侦听onChildAdded 的应用服务器,并在它发生变化时向客户端设备发送通知。
  2. 在客户端应用上创建一个后台服务,监听onChildAdded,并在必要时创建通知。

即便如此,我也不喜欢这些解决方案。 只是想了解实现目标的标准和正确方法。

【问题讨论】:

  • 在使用 Firebase 实时数据库时,您不必保留应用服务器。这就是 Firebase 的全部概念,即您不必保留任何后端服务器来与我们的数据库通信。我不完全知道为什么在使用基于 Firebase 实现的一对一聊天应用程序时也需要实现推送通知?您想在收到新消息时显示通知?
  • 你可以看看这个链接。这可能会有所帮助。 firebase.googleblog.com/2016/08/…
  • @ReazMurshed:我需要在应用未运行时实现推送通知。对于唯一的实时数据库,这是不可能的。如果应用程序未运行,则无法处理该事件。我读了博客。我了解所写的内容,但我认为这不是最好的解决方案,因为 firebase 网站上的文档建议使用 Firebase Cloud 消息传递和 App Server 来实现我的需要。
  • 你读过我在之前评论中提到的谷歌博客吗?它建议有一个 nodejs 应用程序来服务推送通知的目的。
  • 当然,我已经阅读了这篇文章,只是对这个解决方案的真正效率有些怀疑。

标签: android firebase xmpp push firebase-cloud-messaging


【解决方案1】:

Firebaser 和本文作者在 cmets here 的问题中进行了辩论

要使用 Firebase 云消息传递向设备发送消息,您需要指定项目的 FCM 服务器密钥。顾名思义,这个密钥应该只用于在受信任环境中运行的代码中:即您控制的服务器。

要发送设备到设备的消息(例如在接收用户不一定在线的 1:1 聊天应用程序中),您需要两个步骤:

  1. 一个用户发送上游消息
  2. 其他用户收到下游消息

使用 Firebase 云消息传递和您的自定义应用服务器代码,您可以处理第 2 步。但这仍然需要第 1 步:用户需要发送一条消息,以某种方式触发您在应用服务器上的代码。有很多方法可以做到这一点。

例如,您可以在应用服务器上实现 HTTP 端点,并让聊天应用程序也在那里发送消息(除了发送到数据库)。

您还可以实现一个 XMPP 端点并让聊天应用程序在那里发送消息(同样除了将其发送到数据库之外)。

My article 建议另一种方式,一种根本不需要实现端点的方式。它使用在您的应用服务器上运行的 node.js 脚本,本质上只是数据库的客户端。每当此脚本检测到相关聊天消息时,它都会调用 FCM API 并发送下游消息。

在使用 Firebase 时,这种使用 Firebase 数据库作为端点然后使用服务器端脚本的模式非常常见。我们在经典博文Where does Firebase fit in your app?(作为选项2)和article in the Google Cloud documentation 中记录了它。

【讨论】:

  • 您好,谢谢您的回答。我正在考虑将您的文章作为解决我问题的具体方法。我想实现一个 Java 服务器来监听通知(就像您在文章中所做的那样),然后向用户发送通知。我的疑问是:1)这是一个可扩展的解决方案吗?服务器会成为瓶颈吗?最好在node中实现,更可靠,更高效? 2)两个设备之间的消息总是通过实时数据库交换,唯一改变的是当有人发送消息时发送的通知?我的意思是:
  • A 向 B 发送消息。这意味着:1)将消息添加为聊天 A-B 的子项; 2)将通知请求添加为实体通知的子项。 3) 应用服务器读取通知的子节点并向 B 发送推送通知 4) B 打开聊天并使用聊天 A-B 上的监听器 onChildAdded 看到消息。这是流量吗?谢谢。
  • 很好地解释了@FrankvanPuffelen。
猜你喜欢
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2017-11-06
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多