如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?

Posted

技术标签:

【中文标题】如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?【英文标题】:How to send push Notification using FCM and Flutter(One to Another Device)? 【发布时间】:2019-10-23 12:06:51 【问题描述】:

我在 Flutter 中开发了一对一聊天系统,并希望使用 FCM 将推送通知发送到另一台设备。

我已经设置了所有 Flutter 和 Firebase 消息传递要求。

//In InitState()
_firebaseMessaging.onTokenRefresh.listen(sendTokenToServer);
    _firebaseMessaging.getToken();
    _firebaseMessaging.configure(onLaunch: (Map<String, dynamic> msg) 
      print("onLaunch");
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => Message(this.user, this.event)),
      );
    , onResume: (Map<String, dynamic> msg) 
      print("onResume");
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => Message(this.user, this.event)),
      );
    , onMessage: (Map<String, dynamic> msg) 
      print("onMessage");
    );
    _firebaseMessaging.requestNotificationPermissions(
        const iosNotificationSettings(sound: true, alert: true, badge: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings setting) 
      print("IOS");
    );

//sendTokenToServer() - function send FCM token my Postgres DB

//When user clicks on send Button

Future sendNotification(userData, eventData) async 
    await Messaging.sendToAll(
      title:
          "$toBeginningOfSentenceCase(userData['User']['name']) on $toBeginningOfSentenceCase(eventData['Event']['eventName']) event",
      body: _messageController.text,
      fcmToken: fcmTokenToServer,
    );
  

//Messaging.sendToAll()
static Future<Response> sendToAll(
          @required String title,
          @required String body,
          @required String fcmToken) =>
      sendTo(title: title, body: body, fcmToken: fcmToken);

  static Future<Response> sendTo(
    @required String title,
    @required String body,
    @required String fcmToken,
  ) =>
      client.post(
        'https://fcm.googleapis.com/fcm/send',
        body: json.encode(
          'notification': 'body': '$body', 'title': '$title',
          'priority': 'high',
          'data': 
            'click_action': 'FLUTTER_NOTIFICATION_CLICK',
            'id': '1',
            'status': 'done',
          ,
          'to': '$fcmToken',
        ),
        headers: 
          'Content-Type': 'application/json',
          'Authorization': 'key=$serverKey',
        ,
      );

但是没有收到推送通知。是不是我必须实现云功能才能发送通知??

【问题讨论】:

我可以使用 FCM 令牌以及主题 ID 将通知从一台设备发送到另一台设备。代码也是一样的。请尝试主题以及可能是令牌错误 @shyju-madathil 你有没有使用firestore来设备存储令牌或服务器上的数据库?? 无服务器...一个设备到另一个设备。在我的应用中,向帖子所有者发送评论通知 你解决了吗? 【参考方案1】:

我可以在没有服务器的情况下使用主题/FCM 令牌从一台设备向另一台设备发送 FCM 消息。

注意:在客户端使用服务器密钥是一种不好的做法,不应在生产级应用程序中使用。

static Future<bool> sendFcmMessage(String title, String message) async 
    try 
      
      var url = 'https://fcm.googleapis.com/fcm/send';
      var header = 
        "Content-Type": "application/json",
        "Authorization":
            "key=your_server_key",
      ;
      var request = 
        "notification": 
          "title": title,
          "text": message,
          "sound": "default",
          "color": "#990000",
        ,
        "priority": "high",
        "to": "/topics/all",
      ;

      var client = new Client();
      var response =
          await client.post(url, headers: header, body: json.encode(request));
      return true;
     catch (e, s) 
      print(e);
      return false;
    


如果您必须使用 FCM 令牌发送数据请求,请使用

request = 
      'notification': 'title': title, 'body': message,
      'data': 
        'click_action': 'FLUTTER_NOTIFICATION_CLICK',
        'type': 'COMMENT'
      ,
      'to': 'fcmtoken'
    ;

【讨论】:

如何将其添加到主题/topics/user-userId 将发送到特定设备? 只能用fcmtoken发送,不能用userid的topic firebaser here 在客户端代码中使用"key=your_server_key" 是一个严重的安全风险,因为它允许恶意用户向您的用户发送他们想要的任何消息。这是一种不好的做法,不应在生产级应用程序中使用。如需更好的方法,请参阅fireship.io/lessons/flutter-push-notifications-fcm-guide 和我的答案:***.com/a/57842615

以上是关于如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何使用 fcm 以编程方式发送推送通知

Flutter - 如何使用 FCM onResume 和 onLaunch 方法?

currentuser 如何在flutter中通过fcm向另一个用户发送请求通知?

如何构造 FCM 推送通知以在 Flutter(Android 和 iOS)的默认系统 Web 浏览器应用中打开指定的 URL

Flutter iOS 和 Android 中的 FCM 自定义声音

如何在接收基于 Flutter 构建的 FCM 推送通知时修复应用程序崩溃