web-dev-qa-db-ja.com

Cloud Functions for Firebaseを使用してプッシュ通知を送信する

特定のユーザーにプッシュ通知を送信するクラウド機能を作成しようとしています。

ユーザーがいくつかの変更を加え、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を返します。これを解決する方法はありますか?そして、おそらくプッシュ通知を後で送信する方法は?

8
Tudor Lozba

私はなんとかこの仕事をすることができました。これが、私のために機能した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);
    });
})
18
Tudor Lozba

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.
5
Gsilveira

この関数呼び出しを返します。

return ref.on("value", function(snapshot){
        console.log("Val = " + snapshot.val());
        },
    function (errorObject) {
        console.log("The read failed: " + errorObject.code);
});

これにより、リクエストが完了するまでクラウド機能が有効になります。コメントでDougが提供するリンクから約束を返す方法の詳細をご覧ください。

0
Aawaz Gyawali