Firebase云触发器函数 - 如何向所有用户发送通知?

4

我完全是Firebase云函数的新手(仅有2天的接触)。我正在尝试在Firebase数据库检测到新数据添加时向我的应用程序的所有用户发送通知。以下是我目前的进展:

exports.sendNotification = functions.database.ref("/uploads/{pushId}").onCreate(event => {

  const snapshot = event.data;
  var str = snapshot.child("name").val();
  console.log(str);

  if (snapshot.previous.val()) {
    return 0;
  }

  if (snapshot.val().name != "ADMIN") {
    return 0;
  }

  const text = snapshot.val().text;
  const payload = {
    notification: {
      title: snapshot.name,
      body: ""
    }
  }
  //return admin.messaging().sendToDevice(tokens, payload);
});

我知道现在代码混乱不堪,这是由于从各种教程网站复制和测试产生的。我可以通过console.log成功获取数据名称,但无法向所有用户发送通知。
我知道大多数人使用令牌和设备ID。但是是否有更简单的方法向我的每个用户发送通知?我需要添加任何Java代码来使此通知起作用吗?
编辑1: 根据Peter的建议,我已更新了我的函数:
exports.sendNotification = functions.database.ref("/uploads/{pushId}").onCreate(event => {

  const snapshot = event.data;
  var str = snapshot.child("name").val();
  console.log(str);

  if (snapshot.previous.val()) {
    console.log("RETURN 1");
    return 0;
  }

  const payload = {
    notification: {
      title: str,
      body: ""
    }
  }

  return admin.messaging().sendToTopic("Users", payload)
  .then(function(response){
        console.log("Notification sent ", response);
  })
  .catch(function(error){
        console.log("Error sending notification: ", error);
  });
});

我还在我的代码中添加了以下Java代码:

FirebaseMessaging.getInstance().subscribeToTopic("Users");

我现在遇到的问题是,在Firebase控制台上显示通知发送成功,但在我的手机上却没有收到任何消息。在我的情况下,是否必须使用onMessageReceived方法?

我注意到的一件事是,上述语句每次应用程序启动时都会被调用。这对结果有影响吗?


2个回答

3

我认为最简单的方法是使用topics,您可以将所有用户订阅到一个单独的topic中,然后向该主题发送通知。您需要将返回语句更改为以下内容:

return admin.messaging().sendToTopic("Cat", payload);

现在所有订阅“Cat”主题的用户都将收到通知。当然,您也可以将主题更改为任何您想要的内容。

要将用户订阅到主题中,您只需要编写以下代码:

FirebaseMessaging.getInstance().subscribeToTopic("Cat"); //in java code

点击这里获取更多信息,了解主题消息。


听起来非常简单。我明天会尝试它,现在已经凌晨3点了。我会保持更新! - Loke WaiEu
我尝试了你的建议,在控制台上显示通知已成功发送,但我无法在手机上接收到通知。我已经更新了我的问题并进行了更改,请查看。 - Loke WaiEu
如果您只是从控制台发送消息,您不需要云函数,您只需要将用户注册到主题并等待一天,以便主题出现在控制台中,并发送消息。我不认为这会影响结果,您可以创建一个按钮,当他们点击它时,他们会收到通知。 - Peter Haddad
我实际上并不是从控制台发送,我正在尝试创建一个云触发器,每当有人向数据库上传文件时,它将自动向所有用户发送通知。 - Loke WaiEu
我发现它实际上可以在没有onMessageReceived的情况下工作,只是发送者无法接收通知,但其他用户可以。所以是的,我太傻了,没有彻底检查它。非常感谢! - Loke WaiEu

0

对于寻求更直接答案的人

除非您发送给特定用户,否则无法从Firebase函数发送到所有用户。这些将是订阅了某个主题的用户。下面是相应的函数:

sendToTopic(topic, payload); //for topic

或者,您可以使用控制台GUI,即使未订阅主题的用户也会收到消息,前提是您不指定主题或发送到设备选项

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接