如何在 Firebase 控制台之外发出预定的 Firebase 云消息传递通知?

Tri*_*man 5 firebase react-native google-cloud-functions firebase-cloud-messaging firebase-admin

在 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.`);
});
Run Code Online (Sandbox Code Playgroud)

首先,我不确定如何node-schedule与 firebase 云功能交互。日志显示该功能很快终止,我认为这是正确的。操作运行的时间越长,我们的 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.`);
});
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*len 10

Cloud Functions 最多可以运行 9 分钟。因此,除非您使用node-schedule的时间比这更短,否则您当前的方法将不起作用。即使它可以工作,或者如果您提前不到 9 分钟进行安排,使用这种方法也非常不经济,因为您将在等待期间为 Cloud Functions 支付所有费用。


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


最近对此的改进是使用 Cloud Tasks API 以编程方式安排 Cloud Functions 在特定时间使用特定负载调用,然后使用它通过 FCM 发送消息。道格史蒂文森在这里写了一篇很棒的博客文章:如何安排云函数在未来使用云任务运行(构建 Firestore 文档 TTL)。虽然帖子是关于在特定时间删除文档,但您也可以将其与之前的方法结合来​​安排 FCM 消息。


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