Flutter 应用在后台时通知显示为空白

5

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

当我单击此通知时,然后调用onResume并打开应用,但不导航到正确的路由。

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

我想知道通知/消息设置是否位于错误的位置。

  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


你确定正确解析了message的结构吗?(如果你从推送通知中读取标题/正文)?Flutter Firebase Messaging存在一个“bug”,导致onResumeonMessage具有不同的参数结构。 - Herbert Poul
顺便说一句,您知道吗,如果您只想显示标题/消息和图像,则可以直接使用Firebase Messaging从服务器端进行操作,因此您不必自己在客户端上工作。如果您可以这样做,我强烈建议您选择这条路线...在Flutter中处理后台任务很麻烦(而且不受支持),而local_notifications与firebase messaging插件的组合也存在问题.. - Herbert Poul
谢谢@herbert。你指引了我正确的方向。问题已解决。 - Jimmy Casey
1个回答

4
对于所有像我一样因为这个问题浪费了时间的人, 我发送的通知具有父“notification”对象,而应该是“data”对象。
来自这里的答案:https://dev59.com/oK7la4cB1Zd3GeqPWxE_#52116944 正如@boformer所指出的那样,这仅适用于“通知”消息。如果您正在发送“数据”消息,则不会创建通知,并且消息仅通过onMessage传递。更多细节请参阅插件自述文件和Firebase文档。
这就是为什么使用我的代码创建通知时,onMessage的行为符合预期,但是在onResume中使用默认通知的原因。

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