Уведомление о флаттере в ожидании намерения отменяется при нажатии на уведомление FCM

# #android #ios #flutter #dart #firebase-cloud-messaging

Вопрос:

когда я получаю уведомление, firebase_messaging когда приложение находится в фоновом режиме, когда я щелкаю, оно регистрирует эту ошибку в консоли Notification pending intent canceled , а не открывает приложение. и ничего не происходит

пожалуйста, обратите внимание, что я использую flutter 1.22..6 для этого проекта, поэтому мне пришлось использовать старую версию firebase_messageing , которая 7.0.3

У меня есть эти строки в моем AndroidManifest.xml:

 lt;!-- Note i have changed MainActitvy to Application based on documutions --gt;  lt;application  android:name=".Application"   android:label="DR Vendor"  android:requestLegacyExternalStorage="true"  android:usesCleartextTraffic="true"  android:icon="@mipmap/launcher_icon"gt;  ....   lt;intent-filtergt;  lt;action android:name="FLUTTER_NOTIFICATION_CLICK" /gt;  lt;category android:name="android.intent.category.DEFAULT" /gt;  lt;/intent-filtergt;  .....  lt;/applicationgt;   

И у меня есть Application.java чтобы быть похожим :

 package Here I have my package name;  import io.flutter.app.FlutterApplication; import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback; import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;  public class Application extends FlutterApplication implements PluginRegistrantCallback {   @Override  public void onCreate() {  super.onCreate();  FlutterFirebaseMessagingService.setPluginRegistrant(this);  }   @Override  public void registerWith(PluginRegistry registry) {  FirebaseCloudMessagingPluginRegistrant.registerWith(registry);  }  }   

И добавил этот файл в ту же папку FirebaseCloudMessagingPluginRegistrant.java:

 package my bundle name here;  import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;  public final class FirebaseCloudMessagingPluginRegistrant {  public static void registerWith(PluginRegistry registry) {  if (alreadyRegisteredWith(registry)) {  return;  }  FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));  }   private static boolean alreadyRegisteredWith(PluginRegistry registry) {  final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();  if (registry.hasPlugin(key)) {  return true;  }  registry.registrarFor(key);  return false;  } }   

And here is how I added my background handler method as a static top-level method

main.dart

 Futurelt;dynamicgt; myBackgroundMessageHandler(Maplt;String, dynamicgt; message) async {  if (message.containsKey('data')) {  // Handle data message  final dynamic data = message['data'];  }   if (message.containsKey('notification')) {  // Handle notification message  final dynamic notification = message['notification'];  print("got notification");  print(message);  }  print("reached here");  // Or do other work. }    Futurelt;voidgt; main() async { ....  await Firebase.initializeApp();  PushNotificationsManager().init(); ...    

And this is how i initalize FCM when i called the line PushNotificationsManager().init(); in main.dart

 Futurelt;voidgt; init() async {  if (!_initialized) {  // For iOS request permission first.  _firebaseMessaging.requestNotificationPermissions();  _firebaseMessaging.configure();  var initializationSettingsAndroid =  new AndroidInitializationSettings('@mipmap/launcher_icon');  var initializationSettingsIOS = new IOSInitializationSettings();  var initializationSettings = new InitializationSettings(  android: initializationSettingsAndroid, iOS: initializationSettingsIOS);   flutterLocalNotificationsPlugin.initialize(initializationSettings,  onSelectNotification: onSelectNotification);  configureNotifications();   // For testing purposes print the Firebase Messaging token  String token = await _firebaseMessaging.getToken();  print("FirebaseMessaging token: $token");   _initialized = true;  }  }  configureNotifications() {  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();  _firebaseMessaging.configure(  onMessage: (Maplt;String, dynamicgt; message) async {  print("onMessage: $message");  _showNotification(  1234,  "${message['notification']['title']}",  "${message['notification']['body']}",  "${message['data']['order_id']}");  return;  },  onBackgroundMessage: myBackgroundMessageHandler,  onLaunch: (Maplt;String, dynamicgt; message) async {  print("onLaunch: $message");  return;  },  onResume: (Maplt;String, dynamicgt; message) async {  print("onResume: $message");  onSelectNotification("${message['data']['order_id']}");  },  );  _firebaseMessaging.requestNotificationPermissions(  const IosNotificationSettings(  sound: true, badge: true, alert: true, provisional: true));  _firebaseMessaging.onIosSettingsRegistered  .listen((IosNotificationSettings settings) {  print("Settings registered: $settings");  });  _firebaseMessaging.getToken().then((String token) {  assert(token != null);  });  }   

Ответ №1:

Первая проблема заключается в инициализации в основном

 PushNotificationsManager().init();  

Для

 await Firebase.initializeApp();  

и используйте этот код для открытия действия или экрана.

 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {  print('A new onMessageOpenedApp event was published!');  Navigator.pushNamed(context, '/message',  arguments: MessageArguments(message, true));  });  

Спасибо

Комментарии:

1. Спасибо за вашу помощь , но в этой версии 7.0.3 firebase_messaging нет onMessageOpenedApp функции , поэтому я обрабатываю ее onLaunch:(Maplt;String,dynamicgt; message){} внутри FirebaseMEssaging.configure() , как указано в документах https://pub.dev/packages/firebase_messaging/versions/7.0.3 officeal, также я уже await Firebase.initializeApp(); просто забыл упомянуть, обновляя вопрос

2. используйте это void _navigateToItemDetail(Maplt;String, dynamicgt; message) { final Item item = _itemForMessage(message); Navigator.popUntil(context, (Routelt;dynamicgt; route) =gt; route is PageRoute); if (!item.route.isCurrent) { Navigator.push(context, item.route); } } и при запуске этого : _navigateToItemDetail(message);