我的应用程序中有一个通知系统,允许用户设置多个通知,它们可以是:

  • 每日
  • 每周
  • 每月

  • 前两个可以,但是第三个我有问题。
    假设我们在三月,用户将通知设置为在当月31日触发。通知已正确安排,但例如,如果我们在4月(30天)在哪里,通知将在5月1日安排。

    我有两个问题:
  • 如何安排在每月的最后一天进行通知?或者设置它们以在接下来的几个月中优雅地处理这种情况。
  • 如果正确安排了3月31日的通知,那么下一个通知将安排在4月30日,然后在5月31日吗?我的猜测是,3月31日,4月1日和4月31日。

  • 调度多个通知对我来说不是一个选择,因为苹果有一个限制,并且如果用户有6个每月通知(6x12)并且他们可以拥有更多通知,则可以轻松达到该限制。

    谢谢,

    塞尔吉奥

    编辑

    抱歉,我没有正确解释自己。
    我在正确的日期设置通知没有问题。但是我对重复的工作方式有疑问。如果我将通知设置为从3月31日开始的每个月的31日触发(假设我们在3月),那么第一个通知将在正确的日期出现,但是4月会发生什么呢?

    再次感谢。

    最佳答案

    您可以使用以下方法获取特定日期的月份的最后一天

    -(NSDate*)lastDayOfMonthOfDate:(NSDate *)date
    {
        NSInteger dayCount = [self numberOfDaysInMonthCountForDate:date];
    
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
        [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    
        NSDateComponents *comp = [calendar components:
                                  NSYearCalendarUnit |
                                  NSMonthCalendarUnit |
                                  NSDayCalendarUnit fromDate:date];
    
        [comp setDay:dayCount];
    
        return [calendar dateFromComponents:comp];
    }
    
    -(NSInteger)numberOfDaysInMonthCountForDate:(NSDate *)date
    {
        NSCalendar *calendar = [[NSCalendar alloc]   initWithCalendarIdentifier:NSGregorianCalendar];
    
       [calendar setTimeZone:[NSTimeZone timeZoneWithName:TIMEZONE]];
    
        NSRange dayRange = [calendar rangeOfUnit:NSDayCalendarUnit
                                          inUnit:NSMonthCalendarUnit
                                         forDate:date];
    
        return dayRange.length;
    }
    

    从这些方法中查找最后一天,并安排当天的通知

    资料来源:Getting the last day of a month

    10-04 12:15
    查看更多