特定のユーザーにプッシュ通知を送信するクラウド機能を作成しようとしています。
ユーザーがいくつかの変更を加え、firebaseデータベースのノードの下にデータが追加/更新されます(ノードはユーザーIDを表します)。ここで、プッシュ通知をユーザーに送信する機能をトリガーしたいと思います。
DBのユーザーには次の構造があります。
Users
- UID
- - email
- - token
- UID
- - email
- - token
今まで私はこの機能を持っています:
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);
});
コールバックを取得すると、snapshot.val()はnullを返します。これを解決する方法はありますか?そして、おそらくプッシュ通知を後で送信する方法は?
私はなんとかこの仕事をすることができました。これが、私のために機能したCloud Functionsを使用して通知を送信するコードです。
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);
});
})
Jerin A Mathewsからの質問に答えるだけです。トピックを使用してメッセージを送信します。
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.
この関数呼び出しを返します。
return ref.on("value", function(snapshot){
console.log("Val = " + snapshot.val());
},
function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
これにより、リクエストが完了するまでクラウド機能が有効になります。コメントでDougが提供するリンクから約束を返す方法の詳細をご覧ください。