У меня есть облачная функция, развернутая в firebase, которая запускается всякий раз, когда документ изменяется, а затем эта облачная функция отправляет уведомление на устройство пользователей, которые ее изменили, и это полезная нагрузка:
const payload = (admin.messaging.MessagingPayload = {
notification: {
title: "NOTIFICATION FROM CLOUD",
body: "Sent from triggered cloud function!!",
click_action: "FLUTTER_NOTIFICATION_CLICK",
},
data: {
title: "DATA FROM CLOUD",
body: "Sent from triggered cloud function!!",
},
});
Если приложение работает в фоновом режиме или завершено, onBackgroundMessage FCM должно запускать и запускать функцию обратного вызова. Функция выглядит так:
Q. Почему эта функция даже не работает, когда уведомление получено в фоновом режиме?
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
await _showFlutterLocalNotification(
"HEY!!",
"onBackgroundMessage ran myBackgroundMessageHandler()",
);
return Future<void>.value();
}
ниже - _showFlutterLocalNotification () , вызываемый внутри вышеуказанной функции myBackgroudMessageHandler
_showFlutterLocalNotification(String title, String message) async {
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
"DUE_DATE_REMINDER",
"Due date reminder notification",
"Notification channel for task due date reminder.",
);
var iosChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics,
iosChannelSpecifics,
);
await CustomNotificationHandler().flutterLocalNotificationsPlugin.show(
0,
title,
message,
platformChannelSpecifics,
);
}
а это CustomNotificationHandler.dart class:
class CustomNotificationHandler {
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future initializeHandler() async {
var initializationSettingsAndroid = AndroidInitializationSettings(
"app_icon",
);
var initializationSettingsIOS = IOSInitializationSettings(
onDidReceiveLocalNotification: onDidReceiveLocalNotification,
);
var initializationSettings = InitializationSettings(
initializationSettingsAndroid,
initializationSettingsIOS,
);
await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onSelectNotification: onSelectNotification,
);
}
Future onDidReceiveLocalNotification(
int id, String title, String body, String payload) async {
print("RAN onDidReceiveLocalNotification for IOS");
}
Future onSelectNotification(String payload) async {
if (payload != null) {
debugPrint("Notification payload: $payload");
}
debugPrint("OX: DONE WITH PAYLOAD");
}
}
Это мой Application.kt чтобы зарегистрировать плагин FirebaseCloudMessaging, чтобы он работал в фоновом режиме!
class Application : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
override fun onCreate() {
super.onCreate()
FlutterFirebaseMessagingService.setPluginRegistrant(this)
}
override fun registerWith(registry: PluginRegistry?) {
FirebaseMessagingPlugin.registerWith(registry?.
registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
}
}
Это соответствующий блок кода в AndroidManifest. xml
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="DUE_DATE_REMINDER"
/>
Это вывод в консоль при отправке уведомления облачная функция, когда приложение находится в фоновом режиме!
Провели несколько экспериментов:
- Пытался вызвать print внутри функции myBackgroundMessageHandler (), но ничего не напечатал в консоли!
- Попытался инициализировать flutterLocalNotificationPlugin внутри _showFlutterLocalNotification ()