【问题标题】:Run Android native code in background / terminated app在后台/终止的应用程序中运行 Android 本机代码
【发布时间】:2021-02-25 11:20:39
【问题描述】:

我的主要想法是在 Flutter 端通过 FCM 接收推送通知,并在 Android 原生代码端启动可自定义的通知。 我已经设法在原生 Android 代码中创建通知,并通过 MethodChannel 的 invokeMethod 调用 Flutter。 当应用程序在前台时,没有问题,我可以实时接收推送通知并显示在本机代码中实现的通知。

这里的问题是,当应用程序在后台时,我通过 FCM 接收通知数据,在 onBackgroundMessage 方法中没有任何问题,但我无法执行 invokeMethod 来显示通知,因为它给了我 MissingPluginException 错误。

firebaseCloudMessagingListener(BuildContext context) {
    //* iOS Config
    _messaging.requestNotificationPermissions(IosNotificationSettings(sound: true, badge: true, alert: true));

    _messaging.onIosSettingsRegistered.listen((event) {
      print('Registered: $event');
    });

    _messaging.configure(
        onBackgroundMessage: Platform.isIOS ? null : onBackgroundMessageHandler,

        //* When app is in foreground (open)
        onMessage: (Map<String, dynamic> message) async {
          NotificationHandler.showNotification(message['data']); //* This works
        },

        //* When app is in background
        onResume: (Map<String, dynamic> message) async {},

        //* When app is closed
        onLaunch: (Map<String, dynamic> message) async {});
  }

  static Future onBackgroundMessageHandler(Map<String, dynamic> message) async {
    if (message['data'] != null) {
      dynamic data = message['data'];
      print("Receive notification in background");
      NotificationHandler.showNotification(Map<String, dynamic>.from(data)); //! This gives MissingPluginException error
    }

    return Future<void>.value();
  }

显示通知方式:

static void showNotification(var message) async {
    const channel = MethodChannel('channel.luis/notifications');

    channel.invokeMethod('showNotification', {
      "title": message['title'],
      "description": message['body'],
      "type": message['ntfType'],
    });
  }

日志:

I/flutter ( 4160): Receive notification in background
E/flutter ( 4160): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method showNotification on channel channel.luis/notifications)
E/flutter ( 4160): #0      MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:157
E/flutter ( 4160): <asynchronous suspension>
E/flutter ( 4160): #1      MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:332
E/flutter ( 4160): #2      FirebaseNotifications.onBackgroundMessageHandler
package:fact_mobile_app/firebase/firebase_notification_handler.dart:53
E/flutter ( 4160): #3      _fcmSetupBackgroundChannel.<anonymous closure>
package:firebase_messaging/firebase_messaging.dart:38
E/flutter ( 4160): #4      MethodChannel._handleAsMethodCall
package:flutter/…/services/platform_channel.dart:430
E/flutter ( 4160): #5      MethodChannel.setMethodCallHandler.<anonymous closure>
package:flutter/…/services/platform_channel.dart:383
E/flutter ( 4160): #6      _DefaultBinaryMessenger.handlePlatformMessage
package:flutter/…/services/binding.dart:283
E/flutter ( 4160): #7      _invoke3.<anonymous closure> (dart:ui/hooks.dart:280:15)
E/flutter ( 4160): #8      _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 4160): #9      _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 4160): #10     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 4160): #11     _invoke3 (dart:ui/hooks.dart:279:10)
E/flutter ( 4160): #12     _dispatchPlatformMessage (dart:ui/hooks.dart:154:5)
E/flutter ( 4160):

有人可以帮帮我吗?谢谢!

【问题讨论】:

    标签: flutter firebase-cloud-messaging


    【解决方案1】:

    不看你是如何注册 MethodChannel 的,我猜你在 MainActivity 的 configureFlutterEngine 中注册了 MethodChannel。

    问题是,当您的应用程序开始执行代码而终止时,就像 firebase 的 onBackgroundMessageHandler 发生的情况一样,MainActivity 不会被调用,因此您的 MethodChannel 不存在。

    你有两个选择

    1. 为您的本机代码创建一个插件。可以存在于您的项目中,不需要在 pub 上发布。
    2. 在自定义应用程序类中声明并注册您的 MethodChannel

    这样您可以确定您的 MethodChannel 将始终可用,即使在尚未调用 MainActivity 的情况下也是如此。

    【讨论】:

      【解决方案2】:

      你为什么不使用

      flutter_local_notifications(https://pub.dev/packages/flutter_local_notifications)

      awesome_notification(https://pub.dev/packages/awesome_notifications)

      弹出通知的插件?

      特别是 awrsome_notification 插件为您的通知提供了许多自定义因素,例如,动作按钮、颜色、图标、大图片、媒体播放器、进度条等。但是您必须知道,如果您想要自定义 fcm 通知,fcm 消息应该只包含资料图

      【讨论】:

      • 您的回答没有说​​明为什么操作不能从他们的 onBackgroundMessageHandler 调用本机代码。
      猜你喜欢
      • 2020-02-03
      • 1970-01-01
      • 2018-03-31
      • 2012-02-04
      • 2014-02-19
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多