Уведомление о флаттере пустое, когда приложение находится в фоновом режиме

Когда приложение находится в фоновом режиме, onResume не вызывается, но я получаю какое-то уведомление по умолчанию в трее с пустым значком и без изображения.

Когда я нажимаю на это уведомление, вызывается onResume, и приложение открывается, но не переходит по правильному маршруту.

Сообщение 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.

Рабочее уведомление, когда приложение на переднем плане рабочее_уведомление

Не работает уведомление, когда приложение на переднем плане не_рабочее_уведомление

Вы убедились, что правильно разобрали структуру message? (если прочитать заголовок/тело из push-уведомления)? Была «ошибка» в обмене сообщениями флаттера firebase, из-за которой onResume и onMessage имели различную структуру параметров.

Herbert Poul 10.04.2019 21:04

и кстати. вы знаете, что если вы хотите отобразить только заголовок/сообщение и изображение, вы можете сделать это напрямую с помощью обмена сообщениями firebase со стороны сервера, поэтому вам не нужно выполнять работу на клиенте самостоятельно. Если это возможно для вас, я бы очень рекомендовал пойти по этому пути. Обработка фоновых задач во флаттере является PITA (и не поддерживается), а также local_notifications в сочетании с плагином обмена сообщениями firebase также проблематичны.

Herbert Poul 10.04.2019 21:06

Спасибо @герберт. Вы указали мне правильное направление. Получил сортировку.

Jimmy Casey 11.04.2019 21:18
5
3
5 847
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для всех тех, кто, возможно, потерял дни, как и я, из-за этой проблемы. Уведомление, которое я отправлял, имело родительский объект «уведомления», когда он должен был быть объектом «данные».

Из этого ответа здесь: https://stackoverflow.com/a/52116944/1295611

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 использовал уведомление по умолчанию.

Другие вопросы по теме