firebase Flutter通知Firestore新文档与云功能和云消息

qyzbxkaa  于 2023-01-21  发布在  Flutter
关注(0)|答案(2)|浏览(147)

我正在构建一个Flutter应用程序。我在europe-central2中有一个名为"signals"的Firestore集合。我在应用程序中设置了Cloud Messaging,当应用程序在后台时,它就可以工作。现在我想让它在我的"signals"集合中每次创建新文档时都会发出通知。我已经尝试了以下Cloud Functions**:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

var serviceAccount = require("../../serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  //databaseURL: "https://com-rescuer-com-rescuer.europe-central2.firebasedatabase.app"
});

const token = "<the-token-I-got-from-the-emulator-and-works-for-cloud-messaing>";

exports.pushNotifications = functions
    .region('europe-central2')
    .firestore.document("signals/{docId}").onCreate(
        (snapshot) => {
            return admin.messaging().sendToDevice(
                token,
                {
                    notification: {
                        title: "A New Notification",
                        body: "Hello world!",
                    }
                }
            );
        }
    );

但是,它不起作用。使用凭据和/或databaseURL参数,它会在部署时抛出错误,如果没有它们,当调用函数时(当我看到云函数日志时),我会收到"拒绝访问"消息。我已经调用了firebase init并全局安装了firebase工具。

在Flutter方面,我是这样做的:

final FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;

    final token = await firebaseMessaging.getToken();
    print('token $token'); // this is how I get the token for now

    firebaseMessaging.requestPermission(
      provisional: true,
    );

    firebaseMessaging.setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );

我想:

  • 无论应用程序是前台、后台还是已停止,都能够显示通知。
  • 额外的好处是某种定位。例如,我有一堆区域,我想向关注这些区域的用户发送有关新信号的通知
  • 通知将是关于信号列表中的一个信号。我想传递某种密钥来打开前端上特定的新创建的信号。
c9x0cxw0

c9x0cxw01#

如果您在应用程序处于暂停状态或关闭状态时收到通知,这意味着您也将在应用程序处于打开状态时收到通知。
您唯一需要做的就是处理从打开状态的通知中获得的数据,因为它不会像我们在关闭状态中获得的那样显示弹出窗口。
为了向处于打开状态的用户显示通知,请使用本地通知技术。
你需要在初始化Firebase云消息的flutter应用程序中正确处理这个问题。

mm9b1k5b

mm9b1k5b2#

这是我使用Cloud Functions发送通知的代码

// fcm notification
exports.sendNotification = functions.firestore
  .document("hubs/{uid}/alerts/{new_alert}")
  .onWrite(async(change, context)=>{
    const data = change.after.data();
    const uid = context.params.uid;

// I keep my client devices' tokens in a separate collection, which I'm fetching here

    const clients = await (await admin.firestore().doc(`hubs/${uid}`).get()).data().clients;
    
    const payload = {
      "notification":{
        "title": "Firebase messaging",
        "body": `This might need your attention. ${data.alert}`,
      },
    };
    const options = {};

    console.log("sending noti");
    return admin.messaging().sendToDevice(clients, payload, options);
  });

可以使用通配符模式{}在代码的第3行中设置首选文档的路径
要在应用程序中打开新屏幕的通知,请参阅this video
要向特定区域的人发送通知,如果您使用的是Cloud Messaging,则可以针对特定区域创建一个新的通知活动。否则,您最好的选择是为每个区域创建单独的集合。
默认情况下,Firebase Messaging会在您的应用处于后台或终止时显示通知。如果您的应用在通知到达时正在运行,则不会弹出通知。因此,只有在此情况下,您才可以使用this package来弹出通知。
快乐编码!

相关问题