hataaaaa’s diary

個人用メモが中心です

Cloud Functions for Firebaseを使ってRealtime Databaseの更新をPush通知する

アプリ内お知らせみたいな機能をFirebaseのRealtime Databaseで実現してて、DBが更新されたときにPushも送りたかった。Cloud Functions for Firebaseを使うとRealtime Databaseの更新をトリガーに処理を実行できるようなので、Push送信に利用してみる。

Push送信にはFirebase Cloud Messagingを使う。(他のPush配信サービスでも良いですが、Cloud FunctionsでGoogleの外に通信するには料金がかかるみたい*1 )

Cloud Functions for Firebase

  • Realtime DatabaseとかCloud Storageの更新をトリガーにして処理を実行する(ざっくり)
  • ユースケースとしては公式ドキュメントに色々ある *2

全ユーザにPush送信

サクッと全ユーザにRealtime Databaseの更新を通知する。お知らせ一覧の更新を通知したりするのがユースケース的にありそう。

Realtime Databaseの準備

今回は例として、↓のようなDBを用意。

f:id:hataaaaa:20170914072139p:plain 

クライアント側の準備

プッシュ送信に使うFirebase Cloud Messaging APIには全体送信オプションみたいなものは無いようです。なので、例えば「all」というトピックをクライアントから購読するようにしておき、このトピックに対してPushを送信することで全体送信を実現する感じにします。AdminSDKからトピック購読させても良いかもですが、今回はこだわらない感じで。

 

Cloud Functionsの設定

導入は https://firebase.google.com/docs/functions/get-started あたり。

実行するコードは↓

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

exports.dbNotification = functions.database.ref('/notifications/{notificationId}').onWrite(event => {
  const notificationId = event.params.notificationId;
  const notificationPromise = admin.database().ref(`/notifications/${notificationId}`).once("value");

  return Promise.all([notificationPromise]).then(results => {
    const notification = results[0];
    const payload = {
      notification: {
        title: `${notification.child('title').val()}`,
        body: `${notification.child('url').val()}`
      }
    }
    return admin.messaging().sendToTopic('all', payload);
  });
});

 

簡単!

おわりに

今回はRealtime Database × Cloud FunctionsでPushを送るだけだったが、

  • Realtime Databaseはアプリが起動しているとき
  • Pushはアプリが起動してないとき

と、手軽にどちらの起動状態に対してもアクションできるのは良いなーと思った。まだCloud Functionsはベータ版なので、これからに期待。

 

参考リンク