実現したいこと
Flutterアプリ(Android)で通知機能を作りたい!
どうすればいい?
Firebase Cloud Message(以後FCM)を使えばできそう!
MongoDB Atlasをクラウドサーバーとして使ってるけどできるか?
連携機能があって簡単にできそう!ドキュメントもあるし参考にして...
あーでもこれ非推奨になってて、2024年には完全にサポート終了するのか、
じゃあMongoDBのTriggerを使う方法でやってみよう!
これが サーバーサイドをあまり知らない自分にとって つらかったのでまとめます
まず準備
本題以外は軽く飛ばします。そして、サーバーのデータなどはある前提です。
- Step1
- Firebaseのプロジェクトを準備します。
- Step2
- Firebase Admin SDKをMongoDB Atlasに追加します。TriggersのAdd Dependenciesボタンからfirebase-adminを追加します。
- Step3
- Firebaseのプロジェクトから
projectId
clientEmail
privateKey
を取得します。ここではファイルを置く方法もあるのですが、自分の力ではできなかったので、jsonファイルを出力して、その中のデータを直で張り付けるごり押し方法で実装するために準備します。 - Step4
- FlutterでFirebaseを使えるように初期化をして、任意のタイミングで使用したいコレクションのドキュメントに、生成したトークンを配置します。
- Step5
- ここまで出来たらMongoDB AtlasのTriggersからAdd TriggerでTriggerを実装していきます。
いざ実装
Triggerのコード
onPushNotification.js
exports = async function(changeEvent) {
// データベースからデータ取得
const serviceName = 'Cluster';
const database = 'Database';
const collection = context.services.get(serviceName).db(database).collection('Collection');
// ObjectID型でIDを取得
const docId = changeEvent.documentKey._id;
console.log(docId);
// デバイスに登録されたトークンを使うのでデバイスを取得
const device = await collection.findOne({ _id: docId});
// FCMの初期化
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.cert({
projectId: 'ProjectID',
clientEmail: 'ClientEmail',
privateKey: ('PrivateKey').replace(/\\n/g, '\n'),
}),
});
// コレクションのドキュメントからデータを取得
const token = device.token;
console.log(token);
// 通知に送るメッセージ
const message = {
notification: {
body: '通知のメッセージ',
title: '通知のタイトル'
},
token: token
};
// メッセージを送信し、そのレスポンスを処理する
admin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
};
このままじゃ動かないので、下の解説をもとにそれぞれ変更してください。
かんたんに解説
任意の文字列に変更してほしいところ
Cluster
Database
Collection
これらはMongoDB Atlasのそれぞれに適応する名前に変更してください。
ProjectID
ClientEmail
PrivateKey
これらはFireabseからJsonをダウンロードすることで得られます。
方法として、Firebaseのコンソールから、
設定 -> プロジェクトの設定 -> Cloud Messaging、からサービスアカウントの管理に飛ぶと、アカウントが表示されるので、
鍵の管理 -> 鍵を追加、でJsonファイルをダウンロードしてそこから上の3つに反映させます。
通知のメッセージ
通知のタイトル
ここは飛ばしたい通知の内容にしてください!
めっちゃ参考
属性や実装場所やサービスごとに分けます
Mongo DB
-
Push Notifications [Deprecated]
非推奨ですが、Atlasで簡単にFCM連携する方法が載ってる公式ドキュメントです。 -
Push Notifications Using Atlas App Services & iOS Realm SDK
AtlasのTriggerのコードがメインで乗ってます。FCMのあたりは詳しく乗ってないです。 -
MongoDB Stitch の Triggers / Functions で気軽に始めるサーバレス生活
AtlasのTriggerやFunctionについて詳しく書いてあって理解がはかどります。
Firebase
-
Flutter で Firebase Cloud Messaging クライアント アプリを設定する
FlutterでFirebaseのサーバーでFCMを使う方法が載っています。トークンを生成するあたりが参考になります。 -
サーバーに Firebase Admin SDK を追加する
MongoDB AtlasにFirebase Admin SDKを追加するときに参考になったり。 -
[messaging] TypeError: Value is not an object: undefined
Firebase Admin SDKのバージョン関連でエラーが出るのでその参考になります。