Я делаю приложение во Flutter, которое показывает push-уведомление, когда данные вставляются в базу данных mysql, база данных размещается в сети и управляется php-файлом. В Android все работает нормально, но когда я попробовал на iOS, он отправляет мне уведомление - сколько раз я нажимаю на него - пока я не завершу процесс, то он снова начинается с одного. Кажется, что он накапливает потоки или что-то в этом роде, потому что он вызывается с помощью асинхронной функции.
Я работаю с устройствами Android Studio 3.5, iOS 9.3.5 и Android 10. Я проверил в документации local_notifications_plugin, и они делятся частью кода, который должен решить эту проблему, но грех кода, кажется, отформатирован для Objective-c, и мой проект iOS находится в Swift.
Это код вдокументация:
if(![[NSUserDefaults standardUserDefaults]objectForKey:@"Notification"]) {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
[[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"Notification"];
}
Вот так я управляю показом уведомления:
void revisarNuevosDatos() async{
datos_nuevos_venta = await crud_database.getDatos(urlv);
datos_nuevos_tienda = await crud_database.getDatos(urlt);
if(datos_temp_venta.length < datos_nuevos_venta.length && datos_temp_venta.length>0){
String monto = datos_nuevos_venta.last['ingreso'];
showOngoingNotifications(localNotifications, title: "Hay una nueva venta", body: "Nueva venta por un monto de :\$ $monto", id: 0, payload: "0");
}
if(datos_temp_tienda.length < datos_nuevos_tienda.length && datos_temp_tienda.length>0){
String monto = datos_nuevos_tienda.last['venta'];
showOngoingNotifications(localNotifications, title: "Hay un dato en tienda", body: "Nuevo dato en tienda por un monto de :\$ $monto", id: 1, payload: "1");
}
datos_temp_venta = datos_nuevos_venta;
datos_temp_tienda = datos_nuevos_tienda;
}
void iniciar() {
Timer.periodic(Duration(seconds: 5), (timer) {
revisarNuevosDatos();
});
}
Инициализация объекта уведомления:
var initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
var initializationSettingsIOS = IOSInitializationSettings(
onDidReceiveLocalNotification: (id, title, body, payload) =>
onSelectNotification(payload));
var initializationSettings = new InitializationSettings(
initializationSettingsAndroid, initializationSettingsIOS);
localNotifications.initialize(initializationSettings,
onSelectNotification: onSelectNotification);
Мое уведомление о шоукласс:
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:meta/meta.dart';
NotificationDetails get _ongoing{
var androidChannelSpecifics = AndroidNotificationDetails(
'your channel id',
'your channel name',
'your channel description',
importance: Importance.Max,
priority: Priority.High);
var iOSChannelSpecifics = IOSNotificationDetails();
return NotificationDetails(
androidChannelSpecifics, iOSChannelSpecifics);
}
Future showOngoingNotifications(
FlutterLocalNotificationsPlugin notification,{
@required String title,
@required String body,
int id = 0,
String payload = ""
}
) => _showNotification(notification, title: title, body: body, payload: payload);
Future _showNotification(
FlutterLocalNotificationsPlugin notification,{
@required String title,
@required String body,
String payload,
int id = 0
}) => notification.show(id, title, body, _ongoing, payload: payload);