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
全ユーザにPush送信
サクッと全ユーザにRealtime Databaseの更新を通知する。お知らせ一覧の更新を通知したりするのがユースケース的にありそう。
Realtime Databaseの準備
今回は例として、↓のようなDBを用意。
クライアント側の準備
プッシュ送信に使う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はベータ版なので、これからに期待。
参考リンク