Firebaseを使うとサーバーレスで簡単にプッシュ通知の実装ができます。
iOSアプリへのPUSH通知を実装中にわりとハマったところがあったので備忘録として残しておきます。
Functionsのタイムアウトが設定できない
どうやら処理がタイムアウトでエラーになってしまっていたようでした。
タイムアウトの設定をデフォルトの60秒から変更したかったのですがfirebase-cliやfirebaseから設定する方法がわかりませんでした。ちなみにGCPのコンソールからは該当Functionを選択 > 編集 > その他 で設定できます。
GCPコンソール: https://console.cloud.google.com/functions/list こちらはfunctions.runWith()にオプションを指定してやることで解決できました。
const functions = require('firebase-functions') const runtimeOpts = { timeoutSeconds: 300 } functions.runWith(runtimeOpts)
参考URL
https://firebase.google.com/docs/functions/manage-functions?hl=ja#set_timeout_and_memory_allocation
プッシュ通知のサウンド、バイブが鳴らない
PUSH通知のサウンドをオンにしたいのですが設定方法がわかりませんでした。
結論下記のような構造でメッセージのオブジェクトを作成すればOKでした。
// メッセージのパラメータについては下記参照 // https://firebase.google.com/docs/cloud-messaging/admin/send-messages#apns_specific_fields let pushMessage = { notification: { title: 'メッセージの受信', body: 'メッセージ本文', }, apns: { headers: { 'apns-priority': '10' }, payload: { aps: { badge: 9999, sound: 'default' } } }, data: { test: 'test' }, // ここではuser.fcmTokenにFCMトークンが保存されている想定 token: user.fcmToken, }
ソース全体像
全体像としては下記のような感じになりました。
ユーザが作成された際にそのユーザのFCMトークンに対してPUSH通知を送る例です。
const functions = require('firebase-functions') const admin = require('firebase-admin') admin.initializeApp() const firestore = admin.firestore() const settings = { timestampsInSnapshots: true }; firestore.settings(settings); // タイムアウト等、Cloudfunctionsのオプションを設定 // 下記URL参照 // https://firebase.google.com/docs/functions/manage-functions?hl=ja#set_timeout_and_memory_allocation const runtimeOpts = { timeoutSeconds: 300 } exports.saveUser = functions .runWith(runtimeOpts) .firestore .document('version/1/user/{userID}') .onCreate((snapshot, context) => { let user = snapshot.data() // サウンドやバッジなどはiOS、Androidで個別で設定する必要がある。 // メッセージのパラメータについては下記参照 // https://firebase.google.com/docs/cloud-messaging/admin/send-messages#apns_specific_fields let pushMessage = { notification: { title: 'メッセージの受信', body: 'メッセージ本文', }, apns: { headers: { 'apns-priority': '10' }, payload: { aps: { badge: 9999, sound: 'default' } } }, data: { test: 'test' }, // ここではuser.fcmTokenにFCMトークンが保存されている想定 token: user.fcmToken, } admin.messaging().send(pushMessage).then((response) => { return console.log('Successfully sent message:', response) }).catch((e) => { return console.log('Error sending message:', e) }) })