开发者社区 问答 正文

FLUTER FCM On Resume on Launch和on Message Not Work

启动时触发FCM,在Android上运行良好以下是用于处理FCM的代码。iOS通知是在后台应用程序和打开单击应用程序时触发的。

_firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print(message);
        FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
            new FlutterLocalNotificationsPlugin();
        // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
        var initializationSettingsAndroid =
            new AndroidInitializationSettings('launcher_icon');
        var initializationSettingsIOS = new IOSInitializationSettings(
            onDidReceiveLocalNotification: onDidReceiveLocalNotification);
        var initializationSettings = new InitializationSettings(
            initializationSettingsAndroid, initializationSettingsIOS);
        flutterLocalNotificationsPlugin.initialize(initializationSettings,
            onSelectNotification: onSelectNotification);
        var androidPlatformChannelSpecifics = AndroidNotificationDetails(
            '123', 'convoy notification', 'convoy notification',
            importance: Importance.Max,
            priority: Priority.High,
            ticker: 'ticker');
        var iOSPlatformChannelSpecifics = IOSNotificationDetails();
        var platformChannelSpecifics = NotificationDetails(
            androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
        await flutterLocalNotificationsPlugin.show(
            0,
            message['notification']['title'],
            message['notification']['body'],
            platformChannelSpecifics,
            payload: message['data']['payload']);
      },
      onBackgroundMessage: myBackgroundMessageHandler,
      onLaunch: (Map<String, dynamic> message) async {
        var string = message["data"]["payload"];
        var payload = jsonDecode(string);
        print(payload);
        if (payload != null) {
          var type = payload["refresh"];
          if (type == "OFFERS") {
            Future.delayed(Duration(seconds: 3), () {
              _navigateToOffers(payload["id"]);
            });
          } else if (type == "REQUESTS") {
            Future.delayed(Duration(seconds: 3), () {
              _navigateToRequests(payload["id"]);
            });
          }
        }
        //_navigateToItemDetail(message);
      },
      onResume: (Map<String, dynamic> message) async {
        var string = message["data"]["payload"];
        var payload = jsonDecode(string);
        print(payload);
        if (payload != null) {
          var type = payload["refresh"];
          if (type == "OFFERS") {
            _navigateToOffers(payload["id"]);
          } else if (type == "REQUESTS") {
            _navigateToRequests(payload["id"]);
          }
        }
        // _navigateToItemDetail(message);
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(sound: true, badge: true, alert: true));
  }

展开
收起
游客5akardh5cojhg 2019-12-09 14:00:21 532 分享 版权
阿里云 AI 助理回答

这段代码是用Flutter编写的,用于处理Firebase Cloud Messaging (FCM) 推送通知的接收和处理逻辑,分别针对Android和iOS平台。从你的描述来看,Android设备上一切正常,但iOS设备在应用后台或关闭状态下接收通知后,只有当用户点击通知时,onResumeonLaunch 回调才会被触发。

对于iOS平台,确保通知能够正确显示并触发预期行为,你需要检查以下几个关键点:

  1. 确保App Group设置正确:对于iOS,远程通知(特别是后台/杀死状态下的)需要正确的App Group配置,以便Flutter与原生iOS部分之间能共享数据。请确认在Xcode中为你的项目和扩展(如Notification Service Extension)设置了相同的App Group,并且在Firebase Messaging的配置中使用了正确的标识符。

  2. Background Modes启用:在Xcode的项目设置里,确保已经勾选了"Background Modes"中的"Remote notifications"选项。这允许应用在后台接收远程通知。

  3. 静默推送处理:如果你希望在应用后台时也能处理某些逻辑而不仅仅是展示通知,可能需要发送静默推送(content-available: 1)。但是,请注意,静默推送不会自动唤醒应用,它们只能在应用处于活跃或后台时触发didReceiveRemoteNotification回调。对于完全关闭状态的应用,用户必须首先点击通知才能启动应用。

  4. iOS Notification Service Extension:虽然你的代码片段没有直接涉及,但如果涉及到自定义通知内容(比如下载图片等),确保你正确实现了iOS Notification Service Extension,并且它能够正确地处理接收到的通知数据。

  5. 权限请求:你的代码中已经包含了请求iOS通知权限的部分,这是正确的。请确保在实际设备上测试时,用户已授予了通知权限。

  6. Payload结构:确保你的服务器端发送的通知payload符合要求,特别是对于iOS,可能需要包含适当的apns字段来确保消息按预期工作。

如果以上都已确认无误,但问题依旧,可能需要更深入地查看日志、使用调试工具(如Xcode的调试器)或者查阅FlutterFire文档关于iOS特定的配置和已知问题,以进一步诊断问题所在。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: