【问题标题】:firebase messaging and firestore and flutterfirebase 消息传递、firestore 和颤振
【发布时间】:2021-04-18 17:09:18
【问题描述】:

我正在尝试找到一个关于如何通知用户的好教程。我找到了一对,但总是缺少一块!

我创建了一个应用程序,其中一个选项卡是聊天室,任何人都可以在其中与您联系并提出问题。我还有另一个选项卡,其中列出了用户已收到并可以查看的所有通知。

Firebase Messaging 运行良好,当我的应用关闭时我会收到通知。当它在前台 (onMessage) 时,它不会显示覆盖通知,这是我设置的...

我现在主要关心的是,当有人向用户发送聊天消息时,我希望其他用户收到通知,告诉他们有人向他们发送了消息。

我的计划是将通知(即 tokenRead:true/false)保存在 firestore 中,然后通过某种方式告诉 firebase 消息以通知用户。但是怎么办????

请帮忙!谢谢!!!

【问题讨论】:

  • 您需要使用云功能,并在客户端发送新消息时从客户端调用它,或者让它检测数据库上的更改,例如。新消息已保存。
  • @GrahamD 在四处挖掘之后,这似乎是我最后缺少的一步!我希望尽可能地避免成本(似乎云功能不是免费的)所以我想我现在必须找到解决方法......
  • 计算云功能成本。有一个免费配额。但是,没有免费的午餐,您通常会得到您所支付的。看你有多认真。

标签: flutter push-notification firebase-cloud-messaging


【解决方案1】:

这个方法是我使用的,每次用户登录时都会检查“令牌是否已更改”,然后将使用 userId 在 Firestore 上更新它。如果您想向该用户发送通知,您可以使用该令牌。

_firebaseMessaging.onTokenRefresh.listen((newToken) {
      User _currentUser = FirebaseAuth.instance.currentUser;
      FirebaseFirestore.instance
          .doc("tokens/" + _currentUser.uid)
          .set({"token": newToken});
    });

你可以这样发布,这是我用的。

  Future<bool> sendNotification(
      {@required Map<String, dynamic> messageMap,
      @required AppUser appUser,
      @required String token}) async {
    String url = "https://fcm.googleapis.com/fcm/send";
    String _firebaseKey ="<your key>"

    Map<String, String> headers = {
      "Content-type": "application/json",
      "Authorization": "key=$_firebaseKey"
    };
    String json =
        '{ "to" : "$token", "data" : { "message" : "${messageMap["message"]}", "sendBy": "${appUser.name}", "messageType": "${messageMap["messageType"]}", "sendById" : "${appUser.userId}" } }';
    http.post(url, headers: headers, body: json);
    return true;
  }

【讨论】:

  • 谢谢!这看起来不错,但这导致我在 firebase 中配置“功能”,他们表明它不是免费服务。我希望在必要之前避免任何初步费用。所以现在我希望建立一个本地通知流程。检查 firebase 是否有任何新内容并向用户弹出消息。
  • 我对这个问题做了一个更大的解释,你可以看看,也许会对你有所帮助。 stackoverflow.com/questions/65703938/…
【解决方案2】:

当应用程序在前台时,它不会显示覆盖通知,但会调用onMessage 回调。这样您就可以在其中处理新事件并自行显示通知。

在之前的 Flutter firebase_messaging 包中,我们有两个回调。 onMessageonBackgroundMessage。您可以像这样使用这两个回调(根据官方文档):

_firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
        _showItemDialog(message);
      },
      onBackgroundMessage: myBackgroundMessageHandler,
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
        _navigateToItemDetail(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
        _navigateToItemDetail(message);
      },
    );

myBackgroundMessageHandler 就像:

Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
  if (message.containsKey('data')) {
    // Handle data message
    final dynamic data = message['data'];
  }

  if (message.containsKey('notification')) {
    // Handle notification message
    final dynamic notification = message['notification'];
  }

  // Or do other work.
}

有关完整信息,请阅读文档:flutter firebase_messaging

【讨论】:

  • 谢谢!这就是我所拥有的,你证实了这一点。现在我需要发送通知而无需支付 Firebase 服务费用,很可能需要做我自己的自定义类
猜你喜欢
  • 2021-01-19
  • 2021-11-04
  • 2021-05-16
  • 2020-05-12
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多