如何阻止计划的本地通知在特定日期后触发?
Posted
技术标签:
【中文标题】如何阻止计划的本地通知在特定日期后触发?【英文标题】:How do I stop a scheduled local notification from triggering after a particular date? 【发布时间】:2018-05-29 08:34:44 【问题描述】:我正在使用 UNUserNotificationCenter 在 ios 上显示一些本地通知。这些是预定的通知。这是我的高级要求:(类似于 iOS 上的提醒应用程序。您可以选择提醒时间,设置间隔(频率)以及设置到期日期。
我得到了开始日期(2018 年 6 月 1 日)和结束日期(2018 年 6 月 28 日)和时间(例如:每天下午 2: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);
如果应用程序处于前台并且通知会自动取消,则此方法可以正常工作。但是,如果应用程序被终止,那么这些通知仍然会不断出现。有没有办法检查何时在后台触发本地通知,以便可以检查上述逻辑并停止这些通知?
还有其他方法可以让我们在 6 月 28 日下午 2:00 准确地阻止这种情况吗?
另外,我对 iOS 不太熟悉,UICalenderNotification 触发器是否有过期日期?
我尝试使用 ComponentsFromDateToDate 进行试验,但通知仍在发送..
//This is just test data
var d = new NSDateComponents();
NSCalendar currCal = new NSCalendar(NSCalendarType.Gregorian);
var d1 = new NSDateComponents();
d1.Day = 29;
d1.Month = 5;
d1.Year = 2018;
d1.Hour = 12;
d1.Minute = 58;
d1.Second = 00;
var d2 = new NSDateComponents();
d2.Day = 29;
d2.Month = 5;
d2.Year = 2018;
d2.Hour = 13;
d2.Minute = 02;
d2.Second = 00;
currCal.ComponentsFromDateToDate(NSCalendarUnit.Second, d1, d2, NSCalendarOptions.None);
d.Second = 10;
d.Calendar = currCal;
我在这里做错了什么还是应该考虑以不同的方式做事?
我也在考虑使用后台提取并有一段代码可以检查上述日期范围的逻辑。
感谢任何帮助。谢谢!
【问题讨论】:
【参考方案1】:我认为最好的解决方案是:将 28 UNNotificationRequest
添加到 UNUserNotificationCenter
与 UNCalendarNotificationTrigger
from 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);
【讨论】:
谢谢!我有这个想法,但想知道是否有其他方法。以上是关于如何阻止计划的本地通知在特定日期后触发?的主要内容,如果未能解决你的问题,请参考以下文章