Вызовите метод onMessage, когда приложение находится в фоновом режиме во флаттере - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в трепетании и дротике. Я пытаюсь подключить мое приложение к FCM . Когда приложение находится на переднем плане, я создаю flutterLocalNotificationsPlugin, и все работает нормально, но я не знаю, как обрабатывать метод onMessage, когда мое приложение находится в фоновом режиме. У кого-нибудь есть идеи, как я могу решить это?

FirebaseMessaging firebaseMessaging = new FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();

@override
void initState() {
 super.initState();

 var androidInitSettings = new AndroidInitializationSettings('mipmap/ic_launcher');
 var iosInitSettings = new IOSInitializationSettings();
 var initSettings = new InitializationSettings(androidInitSettings, iosInitSettings);
 flutterLocalNotificationsPlugin.initialize(initSettings, selectNotification: onSelectNotification);

 firebaseMessaging.configure(
   onLaunch: (Map<String, dynamic> msg) {
     print(" onLaunch called ${(msg)}");
   },
   onResume: (Map<String, dynamic> msg) {
     print(" onResume called ${(msg)}");
   },
   onMessage: (Map<String, dynamic> msg) {
     showNotification(msg);
     print(" onMessage called ${(msg)}");
   },
 );
 firebaseMessaging.requestNotificationPermissions(const IosNotificationSettings(sound: true, alert: true, badge: true));
 firebaseMessaging.onIosSettingsRegistered.listen((IosNotificationSettings setting) {
   print('IOS Setting Registed');
 });
 firebaseMessaging.getToken().then((token) {
   update(token);
 });
}

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Я вижу, что вы принудительно отображаете уведомление при срабатывании onMessage, вам не нужно этого делать, если приложение работает в фоновом режиме, уведомления будут создаваться автоматически.

onMessage запускается, когда вы получаете уведомление, и приложение открыто и работает на переднем плане. Например, у вас открыто приложение Gmail и получено новое электронное письмо, в этом случае вам не нужно, чтобы уведомление появлялось в области уведомлений. Приложение может решить обработать его напрямую, и onMessage запускается сразу после получения уведомления - это хорошо, так что вам не нужно продолжать пул сервера.

onResume и onLaunch немного отличаются - эти два события не запускаются при получении уведомления. Они запускаются только тогда, когда пользователь выбирает / нажимает на уведомление в области уведомлений. Таким образом, в обоих случаях приложение в настоящее время скрыто, либо вообще не запущено (завершено), либо приложение находится в фоновом режиме - не отображается. В этом случае уведомление поступает на телефон и автоматически помещается в область уведомлений (для этого не нужно кодировать «showNotification»). В этом состоянии пользователь может видеть уведомление, но само приложение еще не знает о нем.

Приложение узнает об уведомлении, только когда пользователь выберет одно из этих уведомлений.

Если приложение вообще не работает, onLaunch будет срабатывать, когда пользователь нажимает на уведомление. Это означает, что приложение не было запущено, и в результате уведомления оно должно было «запускаться с нуля».

Если приложение находится в фоновом режиме, onResume будет срабатывать, когда пользователь выбирает уведомление, возвращая приложение в состояние переднего плана.

EDIT:

Как указал @boformer, это относится только к сообщениям «Уведомление». Если вы отправляете сообщения «Данные», уведомления не создаются, и сообщения доставляются только через onMessage. Подробнее в плагине readme и firebase docs .

0 голосов
/ 03 марта 2019

В соответствии с последним плагином Firebase Cloud Messaging для Flutter версия 4.0.0 + 1, когда вы создаете или компилируете push-уведомление на консоли или в форме , убедитесь, что включают

click_action: FLUTTER_NOTIFICATION_CLICK 

как пара ключ-значение «Пользовательские данные» (в разделе «Дополнительные параметры») при нацеливании на устройство Android. Эта опция включает onResume, когда ваше приложение находится в фоновом режиме.

0 голосов
/ 31 августа 2018

Виртуальная машина Dart не запускается, когда приложение работает в фоновом режиме. Это означает, что вы должны обрабатывать уведомления и сообщения данных в собственном коде (Java / Kotlin / ObjectiveC / Swift).

Чтобы сделать это на Android, обратитесь к официальной документации .

Вам, вероятно, придется удалить плагин firebase_messaging и выполнить всю обработку сообщений вручную. Чтобы отправить содержимое уведомлений в приложение флаттера (пока оно находится на переднем плане), используйте каналы платформы.

Это действительно помогает взглянуть на исходный код плагина firebase_messaging, чтобы увидеть, что происходит на нативной стороне.

...