Flutter - Firebase Cloud Messaging,在iOS上无法收到数据消息

5

通知处理程序

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

POST 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. 应用程序在后台(关闭/终止),"data"呈现并调用onLaunch方法。
  2. 应用程序在后台(最小化),"data"丢失,onResume方法未被调用。
  3. 应用程序在前台,"data"丢失,未调用onMessage方法。
问题是如何接收或处理通知中的"data",同时通知也会传递到系统托盘? 任何帮助将不胜感激。
3个回答

4
在 iOS 上,数据直接附加到消息中,附加数据字段被省略。为了在两个平台上接收数据,你的 myBackgroundMessageHandler() 函数应该像这样:
Future<void> myBackgroundMessageHandler(Map<dynamic, dynamic> message) async {
    var data = message['data'] ?? message;
    print(data);
    String expectedAttribute = data['expectedAttribute'];
  }

您可以在Firebase Messaging Flutter文档的“带有附加数据的通知消息”部分了解更多信息。


1
以聪明、原创和有创意的方式进行翻译。 - Akbar Pulatov
我不知道为什么,但是 if(Platform.isAndroid){message = message["data"];} 不起作用。 - Akbar Pulatov
请将您在message["data"]中获取的内容粘贴在此处。 - Ilo Calistus

4

iOS 消息具有不同的结构,对于 iOS,您不需要使用“data”关键字,例如:

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


2

我之前也遇到了同样的问题,但是花了4-5个小时后我找到了解决方案,并且它对我有效。

你需要从后端传递一个名为content_available的参数,像下面这样。

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

苹果的文档指出,每小时只允许发送4-5次静默通知(带有“content-available”键)。你遇到过任何限制吗?@sanket-vanani - Ugur
不,目前我们正在生产中使用这个实现,并且没有遇到任何问题。工作得很好。用户基数超过10,000,并且每小时发送超过5条通知。@Ugur - Sanket Vanani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接