# #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);