UNNotification не работает, когда дата создается из NSTimeInterval
Следующий код работает (iOS 10.3.3). Кнопка HOME была нажата после триггера, чтобы перевести устройство в фоновый режим. В назначенное время с системным звуком по умолчанию сработало уведомление. Обратите внимание, что текущая дата используется в триггере.
-(UNNotificationRequest *)triggerNotifications: (NSString *)identifier : (NSTimeInterval) interval{
// Note: identifier must be unique or else each new request causes all others to be cancelled.
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = NSLocalizedString(@"Timer expired", nil);
content.body = NSLocalizedString(@"Touch to continue", nil);
content.sound = [UNNotificationSound defaultSound];
content.categoryIdentifier = @"com.nelsoncapes.localNotification";
NSDate *today = [NSDate date];
// NSDate *fireDate = [today dateByAddingTimeInterval:interval];
// first extract the various components of the date
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:today];
NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:today];
NSInteger second = [calendar component:NSCalendarUnitSecond fromDate:today];
//then make new NSDateComponents to pass to the trigger
NSDateComponents *components = [[NSDateComponents alloc]init];
components.hour = hour;
components.minute = minute + 1;
components.second = second;
// construct a calendarnotification trigger and add it to the system
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: identifier content:content trigger:trigger];
NSLog(@"request: %@", request);
[center addNotificationRequest:request withCompletionHandler:nil];
return request;
}
Однако небольшое изменение кода (путем передачи NSTimeInterval методу triggerNotifications) НЕ работает. Обратите внимание, что fireDate создается из переданного NSTimeInterval:
-(UNNotificationRequest *)triggerNotifications: (NSString *)identifier : (NSTimeInterval) interval{
// Note: identifier must be unique or else each new request causes all others to be cancelled.
NSLog(@"interval: %f", interval);
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = NSLocalizedString(@"Timer expired", nil);
content.body = NSLocalizedString(@"Touch to continue", nil);
content.sound = [UNNotificationSound defaultSound];
content.categoryIdentifier = @"com.nelsoncapes.localNotification";
NSDate *today = [NSDate date];
NSDate *fireDate = [today dateByAddingTimeInterval:interval];
// first extract the various components of the date
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:fireDate];
NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:fireDate];
NSInteger second = [calendar component:NSCalendarUnitSecond fromDate:fireDate];
//then make new NSDateComponents to pass to the trigger
NSDateComponents *components = [[NSDateComponents alloc]init];
components.hour = hour;
components.minute = minute;
components.second = second;
// construct a calendarnotification trigger and add it to the system
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: identifier content:content trigger:trigger];
NSLog(@"request: %@", request);
[center addNotificationRequest:request withCompletionHandler:nil];
return request;
}
Это интервал, записанный NSLog (240 секунд) и последующим запросом UNNotificationRequest:
Chime2[2548:1304491] interval: 240.000000
2017-11-04 14:26:39.154548-0500 Hourly Chime2[2548:1304491] request: <UNNotificationRequest: 0x14ec72d0; identifier: AETEwJM9xA1azuQ4pDja, content: <UNNotificationContent: 0x14ec6f80; title: Timer expired, subtitle: (null), body: Touch to continue, categoryIdentifier: com.nelsoncapes.localNotification, launchImageName: , peopleIdentifiers: (
), threadIdentifier: , attachments: (
), badge: (null), sound: <UNNotificationSound: 0x14ec7120>, hasDefaultAction: YES, defaultActionTitle: (null), shouldAddToNotificationsList: YES, shouldAlwaysAlertWhileAppIsForeground: NO, shouldLockDevice: NO, shouldPauseMedia: NO, isSnoozeable: NO, fromSnooze: NO, darwinNotificationName: (null), darwinSnoozedNotificationName: (null), trigger: <UNCalendarNotificationTrigger: 0x14eb6cc0; dateComponents: <NSDateComponents: 0x14ed0980>
Hour: 14
Minute: 30
Second: 39, repeats: NO>>
НО, установка переданного интервала в 60 секунд или 120 секунд работает.
Что здесь происходит?