Не зная вашей модели данных, трудно дать точный ответ, но давайте представим, для упрощения, что вы храните в каждом документе поле с именем notifDate
в формате DDMMYYY и что эти документы хранятся в коллекции с именем notificationTriggers
.
Вы можете написать облачную функцию HTTPS следующим образом:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')({ origin: true });
const moment = require('moment');
admin.initializeApp();
exports.sendDailyNotifications = functions.https.onRequest((request, response) => {
cors(request, response, () => {
const now = moment();
const dateFormatted = now.format('DDMMYYYY');
admin.firestore()
.collection("notificationTriggers").where("notifDate", "==", dateFormatted)
.get()
.then(function(querySnapshot) {
const promises = [];
querySnapshot.forEach(doc => {
const tokenId = doc.data().tokenId; //Assumption: the tokenId is in the doc
const notificationContent = {
notification: {
title: "...",
body: "...", //maybe use some data from the doc, e.g doc.data().notificationContent
icon: "default",
sound : "default"
}
};
promises
.push(admin.messaging().sendToDevice(tokenId, notificationContent));
});
return Promise.all(promises);
})
.then(results => {
response.send(data)
})
.catch(error => {
console.log(error)
response.status(500).send(error)
});
});
});
Затем вы будете вызывать эту облачную функцию каждый день с онлайн-службой CRON, например https://cron-job.org/en/.
Дополнительные примеры отправки уведомлений в облачных функциях приведены в этих SO-ответах Отправка push-уведомлений с использованием облачной функции, когда новый узелдобавлено в базу данных реального времени firebase? , node.js Ошибка развертывания firebase или Firebase: триггер облачного пожарного хранилища не работает для FCM .
Если вы не знакомыс использованием обещаний в облачных функциях я бы посоветовал вам посмотреть 3 видео о «обещаниях JavaScript» из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/
Вы не будетет. е. использование Promise.all()
в приведенном выше коде, поскольку вы выполняете несколько асинхронных задач (метод sendToDevice()
) параллельно.Это подробно описано в третьем видео, упомянутом выше.