LoginSignup
0
0

FlutterでMongoDB AtlasとFirebase Cloud Messageを使って通知機能を作る

Posted at

実現したいこと

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を実装していきます。

いざ実装

Atlas Triggerの設定
Untitl11ed.png
Untitle22d.png
Untitle33d.png

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

Firebase

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0