Как можно получать уведомления по расписанию от Firebase Cloud за пределами консоли Firebase? - PullRequest
0 голосов
/ 17 марта 2020

В консоли Firebase, в представлении Cloud Messaging, пользователи могут создавать тестовые уведомления. Эта функция также позволяет планировать время отправки уведомления на устройство или набор устройств.

Можно ли создавать и отправлять запланированные уведомления FCM для указания c устройства с использованием облачных функций Firebase и Firebase Admin SDK? Есть ли альтернативный способ решения этой проблемы?

Текущий способ отправки запланированных сообщений пользователям выглядит примерно так:

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 с огненной базой облачных функций. Появляются логи, что функция завершается очень быстро, что, я думаю, будет правильным. Чем дольше длится операция, тем дороже она оплачивается в наших счетах. Уведомление все еще работает в запланированное время, хотя. Я не понимаю, как все это работает за кулисами.

Во-вторых, у меня возникают проблемы с отменой этих запланированных уведомлений. Скорее всего, уведомления будут поступать по 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? Или я застрял в этом вопросе?

1 Ответ

1 голос
/ 17 марта 2020

Облачная функция может работать максимум 9 минут. Поэтому, если вы не используете node-schedule в течение периодов, меньших этого, ваш текущий подход не будет работать. Даже если это сработает, или если вы планируете менее чем за 9 минут, использование этого подхода очень неэкономично c, так как вы будете платить за облачные функции за все это время, пока ожидание.


Более распространенный подход - хранить информацию о том, какое сообщение, кому вы хотите доставить, кому и в какое время, в базе данных, а затем использовать регулярные запланированные функции для периодической проверки того, какие сообщения отправлять. Подробнее об этом см. Эти предыдущие вопросы:


Недавним улучшением этого является использование API облачных задач для программного планирования функций облака, вызываемых в определенное время c с указанием c payload, а затем используйте его для отправки сообщения через FCM. Даг Стивенсон написал отличное сообщение в блоге об этом здесь: Как запланировать запуск функции облака в будущем с помощью облачных задач (для создания TTL-документа Firestore) . Несмотря на то, что публикация посвящена удалению документов в определенное время, вы можете комбинировать ее с предыдущим подходом и планировать сообщения FCM.


И еще одна последняя вещь, которую следует отметить: пока Firebase Cloud Messaging будет автоматически обрабатывать отображение из уведомлений сообщений, когда приложение не активно, вы также можете использовать его только для части доставки, используя data сообщений, а затем обрабатывать все отображения в коде приложения. Если вы используете этот подход, вы можете сразу же доставить сообщение FCM data со временем для отображения сообщения, а затем разбудить устройство до отображения сообщения в это время.

...