0

我已经硬编码了这个小时,以帮助我在每个小时的顶部触发本地通知,但是出了点问题。不过,我不知道这是我测试它的方式、我的 Xcode 行为还是代码本身。无论如何,这是我制作的代码,请看一下,并请指导我以更简单或更好的方式编写此类代码。谢谢你。

NSCalendar *calendar1 = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar1 components:(NSHourCalendarUnit |NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:[NSDate date]];
hour = [components hour];
min =[components minute];
sec =[components second];
NSLog(@"hour is %i",hour);

NSLog(@"min is %i",min);

NSLog(@"sec is %i",sec);
if (hour < 24) {
 hour=hour+1;
 } else {
     hour=0;

接着..

[[UIApplication sharedApplication] cancelAllLocalNotifications];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ;
NSDateComponents *componentsForReferenceDate = [[NSDateComponents alloc] init];
[componentsForReferenceDate setHour:hour];
[componentsForReferenceDate setMinute:0];
[componentsForReferenceDate setSecond:0];

 NSDate *fireDateOfNotification = [calendar dateFromComponents: componentsForReferenceDate];

// Create the notification
4

2 回答 2

3

这里有一些事情需要考虑:

  • 在询问日期时,您无需询问分钟和秒数,因为无论如何您都将它们废弃。
  • 您可能应该设置一个 timeZone
  • 当小时为 23 时,您将添加 1,这使 24 不正确
  • 您无需创建新NSDateComponents对象,只需配置您拥有的对象即可

    NSCalendar *calendar = [NSCalendar currentCalendar];
    calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
    
    NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]];
    components.hour   = (components.hour + 1) % 24;
    components.minute = 0;
    components.second = 0;
    
    NSDate *fireDate = [calendar dateFromComponents:components];
    NSLog(@"%@", fireDate);
    

设置小时的使用%可以防止我们超过 23

于 2013-01-12T01:15:43.817 回答
2

您没有展示如何创建通知,但每小时重复一次的最佳方式是使用NSHourCalendarUnit重复间隔。

类型为的本地通知对象UILocalNotification有一个名为repeatInterval 的属性,该属性确定通知传递的重复间隔。

notification.repeatInterval = NSHourCalendarUnit;

您的通知将根据您指定的时间每隔一小时重复一次,因此您在 中正确设置了所有内容NSDate,我认为只需要设置repeatInterval。

于 2013-01-12T00:09:22.683 回答