Уведомления каждый день для определенного диапазона дат

#flutter

#flutter

Вопрос:

Итак, у меня есть приложение, в котором пользователям напоминают принимать лекарства каждый день в определенное время в течение определенного интервала дат. Например, пользователь может выбрать получение уведомления с 16 по 18 сентября 2020 года в определенное время суток

Мой подход: я планирую уведомление, используя flutter_local_notifications пакет с showDailyAtTime() функцией. Однако проблема, с которой я сталкиваюсь, заключается в том, что, предположим, я не открываю приложение снова, нет способа отменить запланированное уведомление, и, таким образом, уведомление появляется даже после указанного диапазона дат. Я бы хотел, чтобы уведомления были отключены, поэтому Firebase, похоже, не подходит.

Ответ №1:

Вы можете решить проблему с помощью плагина FlutterLocalNotificationsPlugin.

Подход заключался бы в вызове метода rescheduleNotifications при каждом запуске приложения. В методе все уведомления удаляются и устанавливаются следующие уведомления. В calculateNotificationTimes , например, вы рассчитываете все уведомления за следующие 30 дней. Например, все уведомления с 16 сентября 2020 года по 18 сентября 2020 года каждый день в выбранное вами время.

 import 'package:flutter_local_notifications/flutter_local_notifications.dart';

Future<void> rescheduleNotifications() async {
  final localNotificationsPlugin = FlutterLocalNotificationsPlugin();
  const initializationSettings = InitializationSettings(AndroidInitializationSettings('app_icon'), IOSInitializationSettings());
  const androidChannelSpecifics = AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description');
  const iOSNotificationDetails = IOSNotificationDetails();
  const notificationsDetails = NotificationDetails(androidChannelSpecifics, iOSNotificationDetails);

  await localNotificationsPlugin.initialize(initializationSettings);
  await localNotificationsPlugin.cancelAll();

  // Calculate the next notifications.
  final notificationTimes = calculateNotificationTimes();

  var _currentNotificationId = 0;
  for (final time in notificationTimes) {
    localNotificationsPlugin.schedule(
      _currentNotificationId  ,
      "It's time to take your medicine.",
      'Take the red pill',
      time,
      notificationsDetails,
      androidAllowWhileIdle: true,
    );
  }
}
  

На iOS существует ограничение, согласно которому у вас может быть включено только 64 уведомления. Недостатком этого метода на iOS является то, что если пользователь не откроет приложение после 64 уведомлений, уведомление отображаться не будет. Я думаю, это нормально, потому что кажется, что пользователь больше не использует приложение.

Не тестировал код.

Комментарии:

1. При этом уведомление не будет появляться каждый день, если я не открою приложение правильно? Кроме того, даже отмена происходит, только если я открываю приложение. Я думаю, что это возвращает ту же проблему

2. С помощью этого метода уведомления могут отображаться каждый день. Для этого методу ‘calculateNotificationTimes’ потребуется выводить только один раз за каждый день. Это имеет преимущество перед showDailyAtTime в том, что ненужные уведомления не могут отображаться.