Я использую 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, но уведомления все еще приходили?
Я также думал об использовании фоновой выборки и получил фрагмент кода, который проверял бы вышеуказанную логику для диапазона дат.
Любая помощь приветствуется.Спасибо!