过去日期的NS通知

时间:2016-01-17 21:44:52

标签: ios nsdate nsnotifications

我正在编写一个有很多日期基于过去的应用。例如,周年纪念日。假设这个日期是2000年12月25日。

用户从日期选择器中选择此日期,然后将日期保存到用户的设备。 (想象一下保存的日期是2000年12月25日)

在考虑我将如何编写NSNotifications时,我意识到我的最大任务(现在看似不可能)是我如何能够向用户发送一个日期的提醒,但是基于日期在过去。

示例
周年纪念日是2000年12月25日

每年12月25日提醒用户。

我想必须有办法,但我的搜索空手而归。

1 个答案:

答案 0 :(得分:1)

不确定您使用的是哪种语言,但此处的基本逻辑是用户选择日期后,为结束日期设置本地通知,然后将重复设置为kCFCalendarUnitYear

objective-C

中的示例代码
-(void)setAlert:(NSDate *)date{
    //Note date here is the closest anniversary date in future you need to determine first
    UILocalNotification *localNotif = [[UILocalNotification alloc]init];
    localNotif.fireDate = date;
    localNotif.alertBody = @"Some text here...";
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
    localNotif.repeatInterval = kCFCalendarUnitYear; //repeat yearly
    //other customization for the notification, for example attach some info using 
    //localNotif.userInfo = @{@"id":@"some Identifier to look for more detail, etc."};
   [[UIApplication sharedApplication]scheduleLocalNotification:localNotif];
}

设置警报并触发警报后,您可以通过实施

来处理AppDelegate.m文件中的通知
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler{
    //handling notification code here.
}

修改

如何获得最接近的日期,您可以实施一种方法来实现这一目标

-(NSDate *) closestNextAnniversary:(NSDate *)selectedDate {
    // selectedDate is the old date you just selected, the idea is extract the month and day component of that date, append it to the current year, if that date is after today, then that's the date you want, otherwise, add the year component by 1 to get the date in next year
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:selectedDate];
    NSInteger day = [calendar component:NSCalendarUnitDay fromDate:selectedDate];
    NSInteger year = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setYear:year];
    [components setMonth:month];
    [components setDay:day];
    NSDate *targetDate = [calendar dateFromComponents:components];
    // now if the target date is after today, then return it, else add one year 
    // special case for Feb 29th, see comments below 
    // your code to handle Feb 29th case.
    if ([targetDate timeIntervalSinceDate:[NSDate date]]>0) return targetDate;
    [components setYear:++year];
    return [calendar dateFromComponents:components];
}

您需要考虑的一件事是如何对待2月29日,您是否希望每年2月28日(非闰年)发出警报,或者您是否希望每四年报警一次?然后你需要实现自己的逻辑。