Как остановить запланированное локальное уведомление от запуска после определенной даты? - PullRequest
0 голосов
/ 29 мая 2018

Я использую UNUserNotificationCenter для отображения некоторых локальных уведомлений на iOS.Это запланированные уведомления.Вот мое требование высокого уровня: (Что-то похожее на приложение Reminders на iOS. У вас есть возможность выбрать время для напоминания, установить интервал (как часто), а также установить дату истечения срока действия.

Iмне дают дату начала (01 июня 2018 года), дату окончания (28 июня 2018 года) и время (например, ежедневно в 14:00). Эти локальные уведомления должны срабатывать только между указанными датами.

Вот мой код:

var content = new UNMutableNotificationContent();
    content.Title = "Title";
    content.Subtitle = "Subtitle";
    content.Body = "Body";
    content.Badge = 1;
    content.CategoryIdentifier = categoryID;
    content.Sound = UNNotificationSound.Default;

    var d = new NSDateComponents {
        Hour = 14
    };
    //Repeat is true, so it will keep triggering when ever the hour reads 14
    var newTrigger = UNCalendarNotificationTrigger.CreateTrigger(d, true);
    var requestID = "notificationRequest";
    var request = UNNotificationRequest.FromIdentifier(requestID, content, newTrigger);

    //Here I set the Delegate to handle the user tapping on notification
    UNUserNotificationCenter.Current.Delegate = new CustomUNUserNotificationCenterDelegate();

    UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) => {
        if (err != null) {
            // Report error
            System.Console.WriteLine("Error: {0}", err);
        } else {
            // Report Success
            System.Console.WriteLine("Notification Scheduled: {0}", request);
        }
    });

И я проверяю условие в методе WillPresentNotification:

public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)  {
    DateTime StartDate = new DateTime(2018, 6, 1, 0, 0, 0);
    DateTime EndDate = new DateTime(2018, 6, 28, 0, 0, 0);
    if ((DateTime.Now > StartDate) && (DateTime.Now < EndDate)) {
        UIAlertView alertView = new UIAlertView();
        alertView.Message = "within the date range";
        alertView.AddButton("OK");
        alertView.Show();
        completionHandler(UNNotificationPresentationOptions.Alert | UNNotificationPresentationOptions.Sound | UNNotificationPresentationOptions.Badge);
    } else {
        var requests = new string[] { "notificationRequest" };
        UNUserNotificationCenter.Current.RemovePendingNotificationRequests(requests);
    }
}

Это прекрасно работает, если приложение находится на переднем плане и уведомленияавтоматически отменяется. Но если приложение убито, эти уведомления продолжают поступать. Есть ли способ проверить, запускается ли локальное уведомление в фоновом режиме, чтобы можно было проверить вышеуказанную логику, и остановить эти уведомления?

Есть ли какой-нибудь другой способ, которым мы можем остановить это именно 28 июня в 2:00 вечера?

Кроме того, я не совсем знаком с iOS, неужели UICalenderNoу триггера даты истечения срока действия?

Я пытался поэкспериментировать с ComponentsFromDateToDate, но уведомления все еще приходили?

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

Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Я думаю, что лучшее решение: добавить 28 UNNotificationRequest в UNUserNotificationCenter с UNCalendarNotificationTrigger из 6.1-6.28, уведомление никогда не будет запущено после 6.28, поэтому таким образом вам не нужно удалять этозапрос вручную.

for(int i = 1; i < 29; i++)
{
    NSDateComponents d = new NSDateComponents() { Year = 2018, Month = 6,Day = i,Hour= 14 };
    UNCalendarNotificationTrigger trigger = UNCalendarNotificationTrigger.CreateTrigger(d, true);
    UNMutableNotificationContent content = new UNMutableNotificationContent() { Title = "xxx", Body = "xxx", CategoryIdentifier = "xxx" };
    UNNotificationRequest request = UNNotificationRequest.FromIdentifier(i.ToString(), content, trigger);
    UNUserNotificationCenter.Current.AddNotificationRequest(request,null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...