【问题标题】:How to subscribe to subcollection in Flutter Firebase Messaging?如何订阅 Flutter Firebase Messaging 中的子集合?
【发布时间】:2021-10-16 15:54:50
【问题描述】:

我正在为我的 Flutter 应用程序处理通知。我已阅读文档,但找不到解决问题的方法。我想订阅子集合并使用 Firebase 函数在子集合发生变化时发送通知。

让我更清楚地说明情况。我的应用程序中有几个用户,并且我设法设置了用于消息传递的子集合。因此,对于每个用户,都有 /users 集合和消息子集合。我想订阅 /messages 子集合以使用 Firebase 函数进行更改。

Typescript 中 Firebase 函数的代码是这样的:

functions.firestore.
    document("users/{userId}/messages/{messageId}")
    .onCreate((snapshot, context) => {
      console.log(snapshot.data());
      console.log(snapshot.data());

      return admin.messaging().sendToTopic("users", {
        notification: {
          title: snapshot.data()["username"],
          body: snapshot.data()["text"],
          clickAction: "FLUTTER_NOTIFICATION_CLICK",
        },
      });
    });

但是,我不知道如何在 Flutter 端订阅子集合(订阅集合我们使用FirebaseMessaging.instance.subscribeToTopic('users');)。

有什么方法可以实现吗?我想检测每个用户的子集合是否有变化。

【问题讨论】:

  • Firebase 云消息传递中没有集合或子集合的概念,它只有一个简单的主题列表。这听起来很像XY problem。你想用这个云函数来完成什么(不是实现,而是用例)?
  • 我想为用户订阅 /users/{userId}/messages 集合,在 Firestore 消息中称为用户集合的子集合。我想订阅单个用户消息,并且从 Cloud Functions 我想在用户订阅 /users/{userId}/messages 集合时向他发送通知。希望我解释正确。

标签: firebase flutter dart firebase-cloud-messaging


【解决方案1】:

Firebase 云消息传递中没有集合或子集合的概念,它只有一个简单的主题列表。

因此,您必须自己将子集合映射到唯一主题名称,例如将两个文档 ID 都放在其中:users_<userId>_messages_<messageId>。使用这样的结构,您的用户可以订阅该特定主题,并且您的服务器端代码可以发送到相同的主题,例如:

functions.firestore.
    document("users/{userId}/messages/{messageId}")
    .onCreate((snapshot, context) => {
      console.log(snapshot.data());
      console.log(snapshot.data());

      return admin.messaging().sendToTopic(
        `users_${context.params.userId}_messages_${context.params.messageId}`, {
        notification: {
          title: snapshot.data()["username"],
          body: snapshot.data()["text"],
          clickAction: "FLUTTER_NOTIFICATION_CLICK",
        },
      });
    });

【讨论】:

  • 感谢您的回答。这现在是有道理的。在 Flutter 中,我必须使用集合来订阅,而不是文档,对吗?我的意思是你写了 users__messages_ 但它必须是 users__messages 才能在 Flutter 端订阅。
  • 我不太了解您的用例,因此将您的问题中所说的内容原封不动地复制到主题中。但是,如果您想通过主题“简单”地定位每个用户,则只能使用主题中的users_${context.params.userId} 部分。请注意,主题不是私有的,因此使用此方案,如果您知道某人的 UID,则可以订阅他们的消息,这在您的用例中可能没问题。
  • 这可能是有道理的,但是document("users/{userId}/messages/{messageId}")呢,不知道这里的userId,是否可以检测到消息子集合?
  • 是的,您拥有的 Cloud Functions 声明会监听所有用户的所有 messages 子集合。
  • 嘿@FlutterDev 这里还需要什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 2021-03-05
  • 2021-09-18
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多