【问题标题】:iOS set local notification on a specific dayiOS 在特定日期设置本地通知
【发布时间】:2013-10-09 15:32:46
【问题描述】:

我确定这个问题在某处重复,但我找不到解决方案。我正在制作一个应用程序,其中一个功能允许用户选择他们将收到本地通知的日期和时间。

他们可以选择他们喜欢的一天中的任何时间,并且可以切换一周中的不同日子(周一、周二、周三等)。通知将每周发送一次。因此,我将用户限制为仅创建 3 个通知 - 如果选择了所有 7 天,我会将 repeatInterval 设置为每天(一个通知)。如果为每 3 个通知选择 6 天,那么我将需要为每一天提供一个单独的通知(总共 3x6=18 个通知)。很可能只会使用 1 个通知,所以这很好。

我知道如何设置未来某个时间的通知,但如何设置周一下午 6 点的通知?

以下是我用于测试的代码。它会在未来 4 秒内设置警报(我是从 applicationDidEnterBackground 调用它)。

    NSDateComponents *changeComponent = [[NSDateComponents alloc] init];
    changeComponent.second = 4;

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    NSDate *itemDate = [theCalendar dateByAddingComponents:changeComponent toDate:[NSDate date] options:0];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.repeatInterval = NSWeekdayCalendarUnit;

【问题讨论】:

  • @Patrick, rmaddy:伙计们,你们找到解决方案了吗?

标签: ios objective-c uilocalnotification


【解决方案1】:

与您现在所做的完全相同,但创建日期不同:

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];
[comps setMonth:1];
[comps setYear:2013];
[comps setHour:10];
[comps setMinute:10];
[comps setSecond:10];
localNotif.fireDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

【讨论】:

  • 嗯,所以这会在 2013 年 1 月 1 日 10:10:10 设置警报?我想知道将它设置为过去的某个日期会发生什么......如果它设置为每周重复,它将在每个星期二自动触发(因为这是 1/1/13 的那一天)?哦,这确实有效。我可以使用NSWeekdayCalendarUnit 在工作日和 NSWeekCalendarUnit 重复,以便 setDay 有一些效果。太棒了!
  • 如果您设置了过去的日期,我认为通知将在您初始化它的同时立即执行。如果应用程序正在运行 - 用户将什么都看不到 - 您的应用程序将收到有关它的通知。
【解决方案2】:

我也搜索过。下面的代码对我有用。将工作日值 1 到 7 星期日传递到星期六,通知正文与您要触发的操作并指定您的日期,然后通知将在该特定日期发送。希望这对您有所帮助。

-(void) weekEndNotificationOnWeekday: (int)weekday :(UILocalNotification *)notification : (NSDate*) alramDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: alramDate];
    [componentsForFireDate setWeekday: weekday] ; //for fixing Sunday
  //   [componentsForFireDate setHour: 20] ; //for fixing 8PM hour
 //    [componentsForFireDate setMinute:0] ;
 //    [componentsForFireDate setSecond:0] ;
    notification.repeatInterval = NSWeekCalendarUnit;
    notification.fireDate=[calendar dateFromComponents:componentsForFireDate];
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

【讨论】:

    【解决方案3】:

    我知道如何设置未来某个时间的通知, 但是如何设置周一下午 6 点的通知?

    您可以使用How to Get an NSDate for a Specific Day of Week and Time from an Existing NSDate 中显示的方法创建一个表示下周一下午 6 点的 NSDate 对象。然后,如果您希望它在每个星期一重复,您可以使用localNotification.repeatInterval = NSWeekCalendarUnit。但是,我不确定夏令时是否能按预期工作。

    【讨论】:

      【解决方案4】:

      我认为您无法如此灵活地安排通知。只需在他们更改下一个时安排下一个,当它触发时安排下一个出现。只需担心取消且易于设置。

      【讨论】:

      • 这不是一个真正的问题 - 他更多的是询问如何在确切日期创建通知 - 而 fireDate 来了。
      猜你喜欢
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多