How to send push Notification using FCM and Flutter(One to Another Device)?

5,021

I could send FCM messages from one device to other with the topic/FCM token without the server.

NOTE : Using the server key at client side is a bad practice and should not be used in production-level applications.

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;
    }
}

If you have to send data request with FCM token, use

request = {
      'notification': {'title': title, 'body': message},
      'data': {
        'click_action': 'FLUTTER_NOTIFICATION_CLICK',
        'type': 'COMMENT'
      },
      'to': 'fcmtoken'
    };
Share:
5,021
Romil
Author by

Romil

Updated on December 11, 2022

Comments

  • Romil
    Romil over 1 year

    I have devloped One to one chat system in flutter and want to send push notification to another device using FCM.

    I have setup all the flutter and firebase messaging requirement.

    //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',
            },
          );
    

    But No push notification is receiving. Is it that I have to implement cloud functions to send notification??