使用FCM向一组设备发送通知

时间:2017-05-21 08:39:33

标签: java firebase firebase-cloud-messaging

我希望能够调用这样的函数:(来自客户端)

void sendNotificationToGroupMembers(String groupId, String message)

使用像这样的数据库结构

/userTokens/userId:userInstanceId
/groupMembers/groupId/[userIds...]
/serverRequests/...

现在,我经过研究后认为我对如何处理它有一个想法,但我不知道它是否是正确的方法,并且它非常涉及我认为应该是一个非常简单的任务,所以我是想知道是否有更简单/更简单的方法来解决我的问题。

我就是这样做的

[后端]

  1. 在Google Cloud Flexible上运行的Servlet中的节点/serverRequets/上注册ChildEventListener
  2. [客户]

    1. 推送到节点/serverRequests/push/groupId:message
    2. [后端]

      1. 获取/groupMembers/groupId/并将userIds保存在列表中
      2. 对于每个userId,在/userTokens/userId中获取他的userInstanceId并保存到列表中
      3. 使用“:batchAdd”
      4. 将每个userInstanceId订阅到主题“groupId”
      5. 向主题“groupId”发送通知
      6. 但是我在步骤4中看到了一个问题。因为要获取userInstanceId,我必须为每个userId使用ValueEventListener发出请求,但由于它们是异步的,我如何确定何时下载了所有instanceId?我是否设置了5秒的计时器?我是否检查userId列表的大小,然后在每次下载instanceId时使用LinkedBlockingQueue之类的东西发布到线程,并且只有达到大小时才执行步骤5?

        因为我找不到多个.equalTo查询,而且我无法下载整个userTokens节点......

1 个答案:

答案 0 :(得分:2)

首先,我会使用Cloud Functions,而不是您设置的自定义侦听器。您可以看到notification function here

的示例

接下来,我会考虑使用topic messaging,因为它将涵盖您正在描述的用例(向组成员发送消息)。我自己使用它,它有魅力。

你的流程现在就像这样:

  • 客户告诉FCM,它想订阅主题groupID

  • 在某些时候,有一条消息被推送到/groupId/messages/中的端点(或者您想构建它,请记住,denormalization of a NoSQL database is good!)

  • 然后使用云端功能收听/{groupId}/messages/{messageId}并向您的主题发布新消息/groupId

我希望这是有道理的,我理解你的问题