当应用程序处于后台时,Flutter 通知为空白

Flutter notification is blank when app is in background

当应用程序在后台运行时,不会调用 onResume,但我在托盘中收到某种带有空白图标且没有图像的默认通知。

当我单击此通知时,会调用 onResume 并打开应用程序,但不会导航到正确的路线。

当 Flutter 应用程序处于前台时,Firebase 消息的行为符合预期。 - onMessage 被调用并且通知在托盘中有图标和图像。

我想知道 notification/messaging 的设置是否在错误的位置。

  class NotificationIcon extends StatefulWidget {
  @override
  NotificationIconState createState() => NotificationIconState();
}

class NotificationIconState extends State<NotificationIcon> {
  FirebaseMessaging firebaseMessaging = new FirebaseMessaging();

  void fcmSubscribe() {
    ...
  }

  void fcmUnSubscribe() {
   ...
  }

  Future showBigPictureNotification(Map<String, dynamic> message) async {
    ...
    var bigPictureStyleInformation = new BigPictureStyleInformation(
        bigPicturePath, BitmapSource.FilePath,
        contentTitle: title, summaryText: messageText);
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
        '', topic, messageText,
        style: AndroidNotificationStyle.BigPicture,
        styleInformation: bigPictureStyleInformation);
    var platformChannelSpecifics =
        new NotificationDetails(androidPlatformChannelSpecifics, null);
    await flutterLocalNotificationsPlugin.show(
        0, title, messageText, platformChannelSpecifics);
  }

  @override
  void initState() {
    super.initState();
    firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
        currentMessage = message;
        await showBigPictureNotification(currentMessage);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
        currentMessage = message;
        await showBigPictureNotification(currentMessage);
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
        currentMessage = message;
        await showBigPictureNotification(currentMessage);
      },
    );

    onSelectNotification(String payload) async {
      await navigatorKey.currentState.push(new MaterialPageRoute(...));
    }

    firebaseMessaging.requestNotificationPermissions();
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    var initializationSettingsAndroid =
        new AndroidInitializationSettings('ic_stat_fiber_new');
    var initializationSettings =
        new InitializationSettings(initializationSettingsAndroid, null);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }

  @override
  Widget build(BuildContext context) {
    < widget >
  }
}

flutter doctor -v
[√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 10.0.16299.1004], locale en-IE)
    • Flutter version 1.2.1 at flutter
    • Framework revision 8661d8aecd (8 weeks ago), 2019-02-14 19:19:53 -0800
    • Engine revision 3757390fa4
    • Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
    • All Android licenses accepted.

[√] Android Studio (version 3.2)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 31.1.1
    • Dart plugin version 181.5656
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)

[√] VS Code (version 1.32.3)
    • VS Code at \AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 2.24.0

[√] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 9 (API 28) (emulator)

• No issues found!
dependencies:
  flutter:
    sdk: flutter
  http:
  url_launcher: 4.2.0+3
  flutter_image: ^1.0.0
  path_provider: 0.4.1
  flutter_downloader: 1.1.3
  fluttertoast: ^2.2.11
  pin_code_view: 0.1.0
  image_picker: 0.4.12+1
  firebase_core: 0.2.5+1
  firebase_storage: 1.1.0+1
  uuid: ^1.0.0
  cupertino_icons: ^0.1.0
  permission_handler: 1.0.1
  transparent_image: 0.1.0
  shared_preferences: 0.4.3
  flutter_launcher_icons: ^0.7.0
  firebase_messaging: 2.1.0
  flutter_local_notifications: 0.4.5

由于 AndroidX 问题,某些依赖项的旧版本。

应用程序在前台时的工作通知 working_notificaiton

当应用程序在前台时通知不工作 not_working_notification

致所有可能像我一样在这个问题上浪费时间的人。 我发送的通知有一个父 'notification' 对象,而它应该是 'data' 对象。

来自此处的回答:

As pointed out by @boformer this only applies for 'Notification' messages. If you're sending 'Data' messages, no notification is created and the messages are delivered only through onMessage. More details in the plugin readme and firebase docs.

这就是为什么使用我的代码创建通知时 onMessage 的行为符合预期,但 onResume 使用的是默认通知。