Как установить частоту повторения в уведомлении пользователя

До iOS 9 мы пишем local notifications как это

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.textField.text;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.repeatInterval = NSCalendarUnitMinute;
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

и в местном уведомлении мы имеем repeatInterval, Сейчас в WWDC2016 Apple объявила User Notification который содержит

  • UNTimeIntervalNotificationTrigger.
  • UNCalendarNotificationTrigger.

    UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:60 repeats:YES];
    

код выше будет вызывать уведомление через каждую минуту. Но не могу установить дату.

NSDateComponents* date = [[NSDateComponents alloc] init];
date.hour = 8;
date.minute = 30;

UNCalendarNotificationTrigger* triggerC = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:date repeats:YES];

код выше даты может быть установлен и повтор будет запущен завтра в 8:30, а не через минуту.

В iOS 10 User Notification как я могу установить дату и время повторения так же, как мы можем установить в UILocalNotification?

Я хочу запланировать User Notification завтра в 8:30 вечера и повторяйте каждую минуту, как код, указанный выше local notification

2 ответа

Вдохновленный @Ramon Vasconcelos, я использую следующий код для настройки интервалов и fireDate вместе

switch (interval) {
    case NSCalendarUnitMinute: {
        unitFlags = NSCalendarUnitSecond;
        break;
    }
    case NSCalendarUnitHour: {
        unitFlags = NSCalendarUnitMinute | NSCalendarUnitSecond;
        break;
    }
    case NSCalendarUnitDay: {
        unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        break;
    }
    case NSCalendarUnitWeekOfYear: {
        unitFlags = NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        break;
    }
    case NSCalendarUnitMonth:{
        unitFlags = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    }
    case NSCalendarUnitYear:{
        unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    }
    default:
        unitFlags = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        break;
}
NSDateComponents *components = [[NSCalendar currentCalendar] components:unitFlags fromDate:fireDate];
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:interval != 0];

Для iOS 10 вы можете использовать так:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:fireDate];
UNCalendarNotificationTrigger* trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];

это имеет тот же эффект от кода iOS 9. Чтобы повторить, вы просто должны использовать компоненты, которые вы хотите повторить.

Другие вопросы по тегам