我希望能够调用这样的函数:(来自客户端)
void sendNotificationToGroupMembers(String groupId, String message)
使用像这样的数据库结构
/userTokens/userId:userInstanceId
/groupMembers/groupId/[userIds...]
/serverRequests/...
现在,我经过研究后认为我对如何处理它有一个想法,但我不知道它是否是正确的方法,并且它非常涉及我认为应该是一个非常简单的任务,所以我是想知道是否有更简单/更简单的方法来解决我的问题。
我就是这样做的
[后端]
/serverRequets/
上注册ChildEventListener [客户]
/serverRequests/push/groupId:message
[后端]
/groupMembers/groupId/
并将userIds保存在列表中/userTokens/userId
中获取他的userInstanceId并保存到列表中但是我在步骤4中看到了一个问题。因为要获取userInstanceId,我必须为每个userId使用ValueEventListener发出请求,但由于它们是异步的,我如何确定何时下载了所有instanceId?我是否设置了5秒的计时器?我是否检查userId列表的大小,然后在每次下载instanceId时使用LinkedBlockingQueue之类的东西发布到线程,并且只有达到大小时才执行步骤5?
因为我找不到多个.equalTo
查询,而且我无法下载整个userTokens节点......
答案 0 :(得分:2)
首先,我会使用Cloud Functions,而不是您设置的自定义侦听器。您可以看到notification function here
的示例接下来,我会考虑使用topic messaging,因为它将涵盖您正在描述的用例(向组成员发送消息)。我自己使用它,它有魅力。
你的流程现在就像这样:
客户告诉FCM,它想订阅主题groupID
。
在某些时候,有一条消息被推送到/groupId/messages/
中的端点(或者您想构建它,请记住,denormalization of a NoSQL database is good!)
然后使用云端功能收听/{groupId}/messages/{messageId}
并向您的主题发布新消息/groupId
我希望这是有道理的,我理解你的问题