J'essaie de créer une fonction cloud qui envoie une notification Push à un utilisateur donné.
L'utilisateur apporte des modifications et les données sont ajoutées/mises à jour sous un nœud dans la base de données Firebase (le nœud représente un identifiant utilisateur). Ici, je veux déclencher une fonction qui envoie une notification Push à l'utilisateur.
J'ai la structure suivante pour les utilisateurs dans DB.
Users
- UID
- - email
- - token
- UID
- - email
- - token
Jusqu'à présent, j'ai cette fonction:
exports.sendNewTripNotification = functions.database.ref('/{uid}/shared_trips/').onWrite(event=>{
const uuid = event.params.uid;
console.log('User to send notification', uuid);
var ref = admin.database().ref('Users/{uuid}');
ref.on("value", function(snapshot){
console.log("Val = " + snapshot.val());
},
function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
Lorsque j'obtiens le rappel, le snapshot.val () renvoie null. Aucune idée sur la façon de résoudre ça? Et peut-être comment envoyer la notification Push par la suite?
J'ai réussi à faire fonctionner ça. Voici le code qui envoie une notification à l'aide des fonctions cloud qui a fonctionné pour moi.
exports.sendNewTripNotification = functions.database.ref('/{uid}/shared_trips/').onWrite(event=>{
const uuid = event.params.uid;
console.log('User to send notification', uuid);
var ref = admin.database().ref(`Users/${uuid}/token`);
return ref.once("value", function(snapshot){
const payload = {
notification: {
title: 'You have been invited to a trip.',
body: 'Tap here to check it out!'
}
};
admin.messaging().sendToDevice(snapshot.val(), payload)
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
})
Juste répondre à la question de Jerin A Mathews ... Envoyer un message en utilisant les sujets:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
//Now we're going to create a function that listens to when a 'Notifications' node changes and send a notificcation
//to all devices subscribed to a topic
exports.sendNotification = functions.database.ref("Notifications/{uid}")
.onWrite(event => {
//This will be the notification model that we Push to firebase
var request = event.data.val();
var payload = {
data:{
username: request.username,
imageUrl: request.imageUrl,
email: request.email,
uid: request.uid,
text: request.text
}
};
//The topic variable can be anything from a username, to a uid
//I find this approach much better than using the refresh token
//as you can subscribe to someone's phone number, username, or some other unique identifier
//to communicate between
//Now let's move onto the code, but before that, let's Push this to firebase
admin.messaging().sendToTopic(request.topic, payload)
.then((response) => {
console.log("Successfully sent message: ", response);
return true;
})
.catch((error) => {
console.log("Error sending message: ", error);
return false;
})
})
//And this is it for building notifications to multiple devices from or to one.
Renvoie cet appel de fonction.
return ref.on("value", function(snapshot){
console.log("Val = " + snapshot.val());
},
function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
Cela maintiendra la fonction cloud active jusqu'à ce que la demande soit terminée. En savoir plus sur les promesses de retour via le lien donné par Doug dans le commentaire.