是否可以为 UILocalNotification 设置有条件的“firedate”?

Posted

技术标签:

【中文标题】是否可以为 UILocalNotification 设置有条件的“firedate”?【英文标题】:Is it possible to have a Conditioned `firedate` for UILocalNotification? 【发布时间】:2013-05-05 01:59:16 【问题描述】:

我正在尝试为我的本地通知设置一个有条件的触发时间,但是当我尝试这两种方法时,它并没有失败,但它仍然不起作用。所以,我想知道我是否能够做这样的事情?

注意: startTime 和 endTime 是来自日期选择器的时间。

-(void) TEST 

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]];
components.hour   = 3;
components.minute = (components.minute + 1) % 60;
components.second = 57;

NSDate *fire = [calendar dateFromComponents:components];
UILocalNotification *notif = [[UILocalNotification alloc]  init] ;
if (notif == nil)
    return;

if (fire < startTime.date) 


notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;


    

if (fire > endTime.date) 


    notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;



-(void) TEST 

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]];
components.hour   = 3;
components.minute = (components.minute + 1) % 60;
components.second = 57;

NSDate *fire = [calendar dateFromComponents:components];
UILocalNotification *notif = [[UILocalNotification alloc]  init] ;
if (notif == nil)
    return;

if (fire > startTime.date & fire < endTime.date) 

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ;


else 
    notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;



谢谢

如果不是,最简单的方法是什么?

【问题讨论】:

您记录了开火日期吗?如果使用组件中的分钟,则需要在从日历+日期(NSMinuteCalendarUnit)获取组件时加载分钟。 是的,我确实记录了它,但它从未进入 if 条件 试试if ([fire timeIntervalSinceDate:startTime.date] &gt;= 0) // fire is before start @relikd 谢谢,但还是不行! :// @Bonnie 你的答案都不起作用,我想没有解决方案可以解决这样的事情,因为无论如何我都找不到在特定时间执行通知取消的背景。 但是,您应该得到 100 分的辛勤工作。谢谢。 【参考方案1】:

使用 NSDate Compare: 方法而不是 if(fire &gt; startTime.date)

if([fire compare: startTime.date] == NSOrderedDescending) // if start is later in time than end

    // do something

来自类参考:

If:
The receiver and anotherDate are exactly equal to each other, NSOrderedSame.
The receiver is later in time than anotherDate, NSOrderedDescending.
The receiver is earlier in time than anotherDate, NSOrderedAscending.

根据你的情况

if (fire > startTime.date & fire < endTime.date) 

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ;

你可以使用

if([fire compare: startTime.date] == NSOrderedDescending && [fire compare: endTime.date]== NSOrderedAescending)

   [[UIApplication sharedApplication] cancelAllLocalNotifications] ;

如果在选定的开始日期和结束日期之间发生火灾,这将取消所有本地通知

else 
// Fire the notifications

还可以查看与您需要的类似的链接link

【讨论】:

不幸的是,通知仍在触发并且没有取消!我听说你不能对 UILocalNotification 进行限制,这是真的吗? 请告诉你究竟需要做什么,什么不起作用,我的假设:startTime 和 EndTime 是不会触发你通知的时间。?对。??根据此代码,如果fireDate在开始时间和结束时间之间,则不会创建通知,因此不可能触发。您是否只想取消在 DoNotDisturb 时间范围内已创建的所有通知。??或者你只是不希望用户允许在 DoNotDisturb 时间范围之间创建新的 UILocalnotication 你的假设是正确的。我想取消 startTime 和 endTime 之间的通知。那么,这段代码是否能够在已经安排好的情况下在后台取消AllLocalNotifications?因为我试过了,没用! 这里是场景,我有一个本地通知,计划每小时重复一次。我希望当用户选择 startTime 和 endTime 时,这些通知将在夜间自动停止并重新安排,而无需打开应用程序。我怎样才能做到这一点?这段代码可以吗? 没有直接的方法,但是,看看这个***.com/questions/15773544/… 正是你需要的【参考方案2】:

我会尝试做的是,当睡眠时间开始时,调用一个方法例如:goingToSleep:,你可以使用 dispatch_laterperformSelector:withObject:afterDelay:

goingToSleep:

NSArray* localNotifications = [[UIApplication sharedApplication] 
                                              scheduledLocalNotifications];
for (UILocalNotification *notification in localNotifications)

    if([fire compare: startTime.date] == NSOrderedDescending &&
       [fire compare: endTime.date]== NSOrderedAescending)
    

这是重要的部分

获取通知的所有属性 为这些属性创建一个 NSDictionary 将 NSDictionary 添加到数组中

并将该数组保存到 plist 中。(Save Array to Plist)

然后使用

取消该通知
[[UIApplication sharedApplication] cancelLocalNotification:notification];

然后在 SleepTime 结束后 ,再次调用一个方法 eg:wakingUp:

然后在wakingUp:

读取我们保存的 NSDictionary 数组。 再次使用相同的属性创建 UILocalnotifications。

这样,在睡眠期间不会触发 UILocalNotifications。如果应用程序不是内存,一个问题可能是执行这些方法。

编辑 To have long Running Appicaions.

【讨论】:

非常感谢代码部分工作。我尝试了延迟属性,它在应用程序运行时工作。但是,我仍在尝试了解 Plist、NSDictionary 和数组,以便可以使其在后台运行。我有 2 个问题:您是否有任何指向教程的链接来解释您的答案?或者你能告诉我详细的答案吗? “如果应用程序不是内存,一个问题可以执行这些方法”是什么意思?什么是内存应用程序? 不幸的是,performSelctor:withObject:afterDelay 在前 10 分钟后无法在后台工作:/ exactly..dat 我的意思是当我说“如果应用程序不是内存,一个问题可以执行这些方法”。即应用程序被操作系统关闭。想办法让它继续运行,我已经发布了link,看看我的其他答案 你为什么回答了两次?你不应该这样做,你应该更新你原来的答案。

以上是关于是否可以为 UILocalNotification 设置有条件的“firedate”?的主要内容,如果未能解决你的问题,请参考以下文章

在特定日期重复 UILocalNotification

创建有声无振动的 UILocalNotification

iOS UILocalNotification 设置为每天触发一次,每两天触发一次,并且仅在星期日触发

发送通知时是不是可以停止播放 UILocalNotification 的声音?

UILocalNotification 可以用来唤醒后台的任务吗

应用程序是不是可以在后台知道 UILocalNotification 何时发生?