8

在 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 云消息传递的调度功能?或者我是否坚持解决这个问题?

4

1 回答 1

15

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


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


最近对此的改进是使用 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 云消息传递会在应用程序不活动时自动处理通知消息的显示,但您也可以将其仅用于使用数据消息的传递部分,然后处理应用程序代码中的所有显示。如果您使用该方法,您可以立即发送 FCM数据消息以及显示消息的时间,然后在该时间唤醒设备以显示消息。

于 2020-03-16T22:27:36.967 回答