在 Firebase Cloud Messaging 上通过 XMPP 传递上游消息的误解
Posted
技术标签:
【中文标题】在 Firebase Cloud Messaging 上通过 XMPP 传递上游消息的误解【英文标题】:Delivering upstream messages via XMPP on Firebase Cloud Messaging misconceptions 【发布时间】:2016-06-30 21:43:57 【问题描述】:我正在尝试在我的应用中设置 FCM 功能。目前,我想显示一个按钮,这样当用户按下按钮时,会生成一条上游消息,该消息将发送到 Google 的 CCS。据我了解,这条上游消息将被 Google CCS 转换为 XMPP 节。然后,它将被传递到具有我在创建上游消息时设置的 id 的手机。从google阅读了关于FCM的文档后,我发现创建上游消息非常简单:
FirebaseMessaging fm = FirebaseMessaging.getInstance();
fm.send(new RemoteMessage.Builder(SENDER_ID + "@gcm.googleapis.com")
.setMessageId(Integer.toString(msgId.incrementAndGet()))
.addData("my_message", "Hello World")
.addData("my_action","SAY_HELLO")
.addData()//somewhere in here must be a way to set the senderId of the phone
// i am trying to send the message to ???
.build());
现在通过查看上面的代码,我看不到 XMPP 被用于创建此上游消息。没有 XMPP 节创建。我的问题是关于这个 XMPP 节被送到哪里?一旦它离开谷歌的CCS。我在扩展的类上看到了一个方法 FirebaseMessagingService 调用 onMessageReceived。据我了解,在这种方法中,XMPP 节将被传递。或者,它是否会在我打算建立的 Smack 库连接上提供,该连接将有一个 PacketListener。根据“Gronkking android”的示例,Google 的 CCS XMPP 节将在此数据包侦听器上传送。我确实打算按照这个例子来接收这些即将到来的节并生成所需的确认消息。
如果有人有任何想法或想法,很高兴听到您的 cmets
谢谢
【问题讨论】:
好的。所以这个应用程序服务器驻留在应用程序代码上,或者在它的外部。从我看到的示例中,我可以使用与 CCS 通信并将相关信息存储在诸如 GoDaddy 之类的 Web 服务器上的 xmpp 接口。但是,我仍然不知道如何实现这些节以通过 smack 与 CCS 进行通信。根据文档,我必须授权我与节的连接。我应该在我的连接中注册一个数据包侦听器吗?我会试试这个,看看我的连接从 CCS 收到了什么。 @亚瑟汤普森 一个非常简单的解释:应用服务器可能是您的家庭服务器或您有权访问的某些服务器(托管服务器),并且它必须运行 xmpp 服务器应用程序。它与 FCM 保持连接,当您的上游消息从设备到达时,FCM 会将消息发送到您的应用服务器。 那么,firebase 文档怎么会说 CCS 使用 XMPP 作为经过身份验证的传输层。它说我可以使用任何 XMPP 库来管理连接。由于 Smack 库提供了 TLS 和认证所需的所有支持,而且它是一个 XMPP 库,我可以使用它来管理连接以创建应用服务器。但我选择在我的代码中使用它,而不是在它外部。 Smack 中的连接对象也可以处理节。我已经在我的代码中设置了带有 Smack 的 TLS。我已经连接到我的代码而不是应用服务器。我在使用 SASLauth 时遇到问题。 @MisterWalrus 是的,我想你是对的。我不明白为什么如果您实现所有必要的 XMPP 支持,您的应用服务器就不能成为设备。 TBH,我没有按照您强迫我看待的方式看待问题。你可能是对的 Smack 可以管理连接。问题是大多数 Smack 样本都已过时。甚至 javadocs 也没有更新。试图拼凑有效信息是一项挑战。 @MisterWalrus 【参考方案1】:FCM 不支持设备到设备的消息传递。上游消息旨在通过 CCS 从您的移动设备发送到您的 XMPP 应用服务器。一旦您的 XMPP 应用服务器接收到消息,它就可以决定通过 CCS 将下游消息发送到移动设备。 XMPP 与节的通信是在 CCS 和您的 XMPP 应用服务器之间完成的。
【讨论】:
【参考方案2】:FCM 云服务适用于公司系统或银行系统等下游的 PUSH 通知。 否则,要完成上游消息的工作,您需要自己的 XMPP 应用程序服务器(通常在公共 IP 上),我看不出有什么办法。 FCM 云服务只会将收到的所有消息转发给它,甚至不会读取它们;始终通过调用 FCM 云服务将所有消息路由到正确的移动设备将是应用程序服务器的职责。我想中间没有 FCM 服务会更容易,只需在某个公共 IP 上使用您自己的 XMPP 服务器,并且移动设备应用程序应该像 XMPP 客户端一样工作。
【讨论】:
以上是关于在 Firebase Cloud Messaging 上通过 XMPP 传递上游消息的误解的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Firebase Cloud Messaging 控制台的情况下向 Flutter/Firebase Cloud Messaging 上的特定设备发送通知 [重复]
在 iOS 中为 Firebase 使用 Cloud Functions