Как избежать дублирования уведомлений ios с Flutter - PullRequest
0 голосов
/ 17 октября 2019

Я делаю приложение во 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);
...