【问题标题】:Firebase messaging onResume, onLaunch or onBackgroundMessage are never called永远不会调用 Firebase 消息传递 onResume、onLaunch 或 onBackgroundMessage
【发布时间】:2021-03-31 11:54:13
【问题描述】:

我正在使用 Firebase Cloud Messaging 包进行颤振。 我希望每当用户点击收到的通知时,flutter 应用程序都会打开并根据 fcm 发送的数据导航到特定屏幕。

但是当应用程序在后台或应用程序关闭时,我无法实现所需的行为,因为永远不会调用 onResume 和 onLaunch 处理程序。我已经尝试了一些解决方案,比如创建通知通道,使用类似的包 flutter_local_notifications 等。但对我没有任何帮助。

这是我处理 fcm 相关任务的 FirebaseMessagingService 类

class FirebaseMessagingService {
  final FirebaseMessaging _fcm = FirebaseMessaging();
  final RouterService _routerService = locator<RouterService>();
  final LocalStorageService _localStorage = locator<LocalStorageService>();
  Future initialise() async {
    if (Platform.isIOS) {
      _fcm.requestNotificationPermissions(IosNotificationSettings());
    }
    _fcm.configure(
        onMessage: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};

          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onLaunch: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};
          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onResume: (Map<String, dynamic> message) async {
          Map<String, dynamic> arguments = {};

          Map<String, dynamic> data = message['data'];
          if (data.containsKey('argument')) {
            if (data.containsKey('value')) {
              arguments[data['argument']] = data['value'];
            }
          }
          _routerService.navigationKey.currentState
              .pushReplacementNamed('${data['route']}', arguments: arguments);
        },
        onBackgroundMessage: _myBackgroundMessageHandler);
  }

  static Future<dynamic> _myBackgroundMessageHandler(
      Map<String, dynamic> message) async {
    final RouterService _routerService = locator<RouterService>();
    if (message.containsKey('data')) {
      // Handle data message
      Map<String, dynamic> arguments = {};
      Map<String, dynamic> data = message['data'];
      if (data.containsKey('argument')) {
        if (data.containsKey('value')) {
          arguments[data['argument']] = data['value'];
        }
      }
      _routerService.navigationKey.currentState
          .pushReplacementNamed('${data['route']}', arguments: arguments);
    }

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: firebase flutter notifications firebase-cloud-messaging


    【解决方案1】:

    我找到了解决方案。首先,您必须将此代码添加到您的清单中:

    <intent-filter>
        <action android:name="FLUTTER_NOTIFICATION_CLICK"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    

    完成此操作后,您必须传递您的 Firebase 云消息:

    click_action => FLUTTER_NOTIFICATION_CLICK
    

    那么你也可以作为数据传递,例如route =&gt; detailScreen

    完成此操作后,您可以通过检查您在 FCM 中传递的 rout 来调用诸如 onResumeOnLaunch 之类的 firebase 消息传递函数。

    当您检查路线时,您可以使用此功能导航任何屏幕:

    //PRIVATE METHOD TO HANDLE NAVIGATION TO SPECIFIC PAGE
    void _navigateToSignalsPage(Map<String, dynamic> message) {
      final MessageBean item = _itemForMessage(message);
      // Clear away dialogs
      //  Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
      if (!item.route.isCurrent) {
        print('heey girl ${item.route}');
        Navigator.push(
            context, MaterialPageRoute(builder: (context) => HomePage(selectedPage: 0,)));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2020-08-16
      • 2020-05-05
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2021-01-06
      相关资源
      最近更新 更多