【コピペで使える CloudFunctions】Firebaseでプッシュ通知を送る処理

この記事では Firebase の CloudFunctions を利用してプッシュ通知を送る処理の解説をします。 コピペして利用できるように、どのように書くと Firestore のデータにアクセスできるのかなど、 なるべく完結に書いていきたいと思います。

前提として以下の箇所までできている人を対象とします。



以下のソースコードは こちらのサイト を参考にさせていただきました。



Firestoreのデータ構造

Firestoreのデータ構造は以下のようになっています。

Firestore構成


プッシュする内容を作成するメソッド

fcmToken : プッシュ通知をするデバイスのトークン

text : 通知したい任意のテキスト


const pushMessage = (fcmToken, text) => ({
    notification: {
        title: '新しいオファーを受信しました。',
        body:  `${text}`,
    },
    data: {
        data: 'test', // ← 任意のデータを送れる
    },
    token: fcmToken
});


送信用メソッド

どこのドキュメントの追加をハンドリングするかを初めの一行に書きます。

以下の場合だと users/{userID}/offers/{offerID} になります。

snapshot.data() で追加したデータにアクセスできます。

context.params.userIDusers/{userID}/offers/{offerID}userID にアクセスできます。


exports.sendOffer = functions.firestore.document('users/{userID}/offers/{offerID}').onCreate((snapshot, context) => {
    const offerID = snapshot.data().id // ← これで offers の id フィールドが取得できる
    const userID = context.params.userID // ← これで userID が取得できる

    const fcmTokenRef = firestore.doc(`users/${userID}/info/notification`)

    fcmTokenRef.get().then((fcmToken) => {
        const token = fcmToken.data()
        admin.messaging().send(pushMessage(token.fcmToken, "プッシュ通知テスト"))
            .then((response) => { console.log('Successfully sent message:', response) })
            .catch((e) => { console.log('Error sending message:', e) })
    }).catch((e) => console.log(e))

});


ソースコード全体

以下はソースコード全体になります。

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
const firestore = admin.firestore()

const pushMessage = (fcmToken, text) => ({
    notification: {
        title: '新しいオファーを受信しました。',
        body:  `${text}`,
    },
    data: {
        data: 'test',
    },
    token: fcmToken
});

exports.sendOffer = functions.firestore.document('users/{userID}/offers/{offerID}').onCreate((snapshot, context) => {
    const offerID = snapshot.data().id
    const userID = context.params.userID

    const fcmTokenRef = firestore.doc(`users/${userID}/info/notification`)

    fcmTokenRef.get().then((fcmToken) => {
        const token = fcmToken.data()
        admin.messaging().send(pushMessage(token.fcmToken, "プッシュ通知テスト"))
            .then((response) => { console.log('Successfully sent message:', response) })
            .catch((e) => { console.log('Error sending message:', e) })
    }).catch((e) => console.log(e))

});

以上で端末側からFirestoreにデータを送信したタイミングで任意の端末にプッシュ通知が送ることができます。

0 コメント