【问题标题】:How can scheduled Firebase Cloud Messaging notifications be made outside of the Firebase Console?如何在 Firebase 控制台之外发出预定的 Firebase 云消息传递通知?
【发布时间】:2020-06-28 00:28:35
【问题描述】:

在 Firebase 控制台的 Cloud Messaging 视图下,用户可以创建测试通知。此功能还允许您安排将通知发送到一个或一组设备的时间。

是否可以使用 Firebase 云功能和 Firebase Admin SDK 创建和发送预定 FCM 通知到特定设备?有没有其他方法可以解决这个问题?

我向用户发送预定消息的当前方式是这样的:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const schedule = require('node-schedule');
admin.initializeApp();

exports.setScheduledNotification = functions.https.onRequest(async (req, res) => {
    const key = req.query.notification_key;

    const message = {
        notification: {
            title: 'Test Notification',
            body: 'Test Notification body.'
        }
    };

    var currentDate = new Date();
    var laterDate = new Date(currentDate.getTime() + (1 * 60000));

    var job = schedule.scheduleJob(key, laterDate, () => {
        const snapshot = admin.messaging().sendToDevice(key, message);
    });

    return res.status(200).send(`Message has been scheduled.`);
});

首先,我不确定node-schedule 如何与firebase 云功能交互。日志显示该功能很快终止,我认为这是正确的。操作运行的时间越长,它在我们的火力基地账单中的成本就越高。不过,通知仍然会在预定时间运行。我对这一切在幕后如何运作感到困惑。

其次,我在取消这些预定通知时遇到问题。从创建之日起,通知很可能会按照 2 小时的时间安排进行。在 2 小时结束之前,我希望能够使用更新的预定时间取消/覆盖通知。

我尝试取消通知,但找不到之前创建的通知。这是代码:

exports.cancelScheduledNotification = functions.https.onRequest(async (req, res) => {
    const key = req.query.notification_key;

    var job = schedule.scheduledJobs[key];
    job.cancel();

    return res.status(200).send(`Message has been canceled.`);
});

是否可以在 Firebase 控制台之外利用 Firebase 云消息传递的调度功能?还是我一直在解决这个问题?

【问题讨论】:

  • “是否可以使用 Firebase 云功能和 Firebase Admin SDK 创建预定的 FCM 通知并将其发送到特定设备?” Firebase Cloud Message 没有允许按计划发送消息的 API。您似乎已经知道这一点,否则我对您尝试解决问题的方式感到有些惊讶。我会在下面写一个更长的答案,但想从这个开始,因为你的问题缺乏重点,我更愿意回答而不是缺乏。

标签: firebase react-native google-cloud-functions firebase-cloud-messaging firebase-admin


【解决方案1】:

云函数最多可以运行 9 分钟。因此,除非您在比这更短的时间内使用 node-schedule,否则您当前的方法将不起作用。即使它会起作用,或者如果您提前不到 9 分钟进行调度,使用这种方法也是非常不经济的,因为您将在等待期间一直为 Cloud Functions 付费。


一种更常见的方法是在数据库中存储有关您希望在什么时间将什么消息传递给谁的信息,然后使用常规计划函数定期检查要发送的消息。有关这方面的更多信息,请参阅这些以前的问题:


最近对此的改进是使用 Cloud Tasks API 以编程方式安排 Cloud Functions 在特定时间以特定负载调用,然后使用它通过 FCM 发送消息。 Doug Stevenson 在这里写了一篇很棒的博客文章:How to schedule a Cloud Function to run in the future with Cloud Tasks (to build a Firestore document TTL)。虽然该帖子是关于在特定时间删除文档,但您也可以将其与之前的方法结合使用来安排 FCM 消息。


最后要注意的一点:虽然 Firebase 云消息传递会在应用程序未处于活动状态时自动处理 通知 消息的显示,但您也可以使用 将其仅用于交付部分data 消息,然后处理应用程序代码中的所有显示。如果您使用这种方法,您可以立即发送 FCM data 消息以及显示该消息的时间,然后唤醒设备以在该时间显示该消息.

【讨论】:

  • 我最终使用 Cloud Tasks API 来安排 Cloud Functions。感谢您的帮助!
  • @TristanHeilman,你能分享更多关于这个的信息吗?或许有一些关于如何使用 Cloud Tasks API 触发 FCM 的示例?
  • 出于好奇,如果 FCM 不支持定时通知,Firebase 控制台如何解决定时通知的问题。
  • FCM API 不支持预定消息。 Firebase 控制台使用自己的专有机制来安排通知。
猜你喜欢
  • 2016-09-19
  • 2016-09-22
  • 2020-04-23
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2016-12-25
  • 2021-12-19
  • 2016-12-13
相关资源
最近更新 更多