# #android #firebase #flutter #push-notification #flutter-local-notification
Вопрос:
Я получаю уведомление от своего сервера в определенное время, чтобы показать пользователям уведомление. Однако всякий раз, когда мое устройство получает сообщение от Firebase Cloud Messaging FlutterLocalNotificationsPlugin
, в конечном итоге отображаются два уведомления, как показано ниже.
Я уже подтвердил, что получаю одно уведомление от своего сервера, просто я думаю, что где-то в интерфейсе оно обрабатывается неправильно.
Вот мой код, в котором я вызываю это в фоновом режиме
main
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print('Handling a background message ${message.messageId}');
if (message.notification != null) {
print(message.notification.title);
print(message.notification.body);
flutterLocalNotificationsPlugin.show(
message.notification.hashCode,
message.notification.title,
message.notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channel.description,
icon: 'launch_background',
),
iOS: IOSNotificationDetails()
));
}
// Create a notification for this
}
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.high,
);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
// Starting FlutterFire through the suggestion found here
// https://firebase.flutter.dev/docs/overview
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
/// Create an Android Notification Channel.
/// We use this channel in the `AndroidManifest.xml` file to override the
/// default FCM channel to enable heads up notifications.
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
/// Update the iOS foreground notification presentation options to allow
/// heads up notifications.
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
runApp(MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
User _user;
FirebaseAnalytics analytics;
bool _error = false;
void _handleLogin(User user) {
// print("Handle Login");
setState(() {
_user = user;
});
}
@override
void initState() {
super.initState();
// if we opened the app through a notification, it will send us via this
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('On Message Opened!');
print(message);
});
}
@override
Widget build(BuildContext context) {
}
}
Ответ №1:
На всякий случай, если кто-то наткнется на ту же проблему. Я перечитал документацию по FlutterFire, где упоминается, есть ли у вас текущий обновленный SDK Flutter и Firebase, затем он попытается отобразить его автоматически. Моя ошибка заключалась в том, что я реализовал FlutterLocalNotifications
в дополнение к этому, и я получал два уведомления, одно из которых было ручным, а другое автоматическим.
При отправке сообщения на устройство убедитесь, что это notification
не «а», а «а data
«. В документации упоминается, что если вы отправите data
его, оно, скорее всего, будет проигнорировано как push-уведомление. Вместо этого используйте его только для отправки пакетов данных в приложение.
Комментарии:
1. Есть ли способ
notification
вручную обработать тип для IOS? значит, он не отображается автоматически?2. В этом случае вы захотите отправить свое уведомление как
data
тип, а неnotification
как . Вы можете выбрать, чтобы вручную отобразить его с помощьюFlutterLocalNotifications
3. да, я знаю, что данные не запускаются автоматически. но, к сожалению, я не могу изменить это со стороны сервера и хочу обработать это со стороны Flutter.
Ответ №2:
Комментирование этой части кода решает проблему.
/// Обновите параметры представления уведомлений на переднем плане iOS, чтобы разрешить /// уведомления о начале. ожидать
FirebaseMessaging.instance.setforegroundnotificationпредставленияопции( предупреждение: верно, значок: верно, звук: верно, );
Комментарии:
1. Не работает в моем случае