Flutter - Firebase云消息,iOS上未接收到数据消息

yizd12fk  于 2023-03-19  发布在  Flutter
关注(0)|答案(3)|浏览(396)

通知处理程序

void firebaseCloudMessagingListeners() {
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print('onMessage ==> $message');
        messageHandler(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print('onResume ==> $message');
        messageHandler(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print('onLaunch ==> $message');
        messageHandler(message);
      },
      onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler,
    );
  }

  static Future<dynamic> myBackgroundMessageHandler(
      Map<String, dynamic> message) {
    print('onBackgroundMessage ==> $message');
    if (message.containsKey('data')) {
      final dynamic data = message['data'];
      print('$data');
    }

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

    return null;
  }

开机自检https://fcm.googleapis.com/fcm/send

{
   "to": "myFCMToken",
   "priority": "high",
   "data": {
      "click_action": "FLUTTER_NOTIFICATION_CLICK",
      "data_title": "data_title",
      "data_body": "data_body"
   },
   "notification": {
      "title": "Good Night",
      "body": "Wish you have a nice dream..",
      "sound": "default"
   }
}

当我用上面的有效负载发送通知时,通知被传送到系统托盘,当我点击它时,我有以下三种情况:
1.应用程序处于后台(关闭/终止),显示“数据”并调用onLaunch方法。
1.应用程序处于后台(最小化),缺少“数据”,未调用onResume方法。
1.应用程序位于前台,缺少“数据”,未调用onMessage方法。
问题是,如何接收或处理通知的“数据”也传递到系统托盘?任何帮助将不胜感激。

cu6pst1q

cu6pst1q1#

IOS消息具有不同的结构,IOS不需要“数据”,例如

if(Platform.isAndroid){
          roomId = message['data']['chatRoomId'];
          senderId = message['data']['senderId'];
        }else if(Platform.isIOS){//without data
          roomId = message['chatRoomId'];
          senderId = message['senderId'];
        }
yeotifhr

yeotifhr2#

在iOS上,数据直接附加到消息中,而省略了额外的数据字段。要在两个平台上接收数据,myBackgroundMessageHandler()函数应如下所示:

Future<void> myBackgroundMessageHandler(Map<dynamic, dynamic> message) async {
    var data = message['data'] ?? message;
    print(data);
    String expectedAttribute = data['expectedAttribute'];
  }

您可以在Firebase消息传递Flutter文档中的“包含其他数据的通知消息”部分了解更多信息。

np8igboo

np8igboo3#

我也面临着同样的问题,但花了4-5个小时后,我得到了这个解决方案,它对我很有效。
您应该必须从后端传递一个名为content_available的参数,如下所示。

"to": "/topics/qa_notify_all",
"content_available": true,
"data": {
         ....
        }

相关问题