Как мне установить NSCalendarUnitMinute repeatInterval в iOS 10 пользовательских уведомлений?

В UILocalNotification мы используем NSCalendarUnitMinute как повторение..... но я не могу найти в iOS 10 UserNotification doc... Как я могу использовать NSCalendarUnitMinute как повторение в iOS 10 UserNotification?

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

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];

3 ответа

Хотя кажется, что старая структура уведомлений имела лучшую поддержку в этом отношении, пока мы не поймем, что новая лучше!

У меня были похожие проблемы, и ниже приведен пример того, как старые уведомления могут идти рука об руку с новыми.

Чтобы быть на более безопасной стороне, это Swift2.3,

// Retrieve interval to be used for repeating the notification
    private func retrieveRepeatInterval(repeatTemp: RepeatInterval) {
        switch repeatTemp {
        case .Never:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month, .Year], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = false
            } else {
                repeatIntervalTemp = nil
            }
        case .EveryMinute:
            if #available(iOS 10.0, *) {
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Minute
            }
        case .EveryHour:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Minute], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Hour
            }
        case .EveryDay:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Day
            }
        case .EveryWeek:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Weekday], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .WeekOfYear
            }
        case .EveryMonth:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Month
            }
        case .EveryYear:
            if #available(iOS 10.0, *) {
                toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month], fromDate: timeTemp!)
                toDateComponents.second = 0
                repeatNotification = true
            } else {
                repeatIntervalTemp = .Year
            }
        }
    }

Хотя это не является исчерпывающим, я в значительной степени покрыл все от минуты до года.

И чтобы быть более подробным,

// RepeatInterval
enum RepeatInterval : String, CustomStringConvertible {
    case Never = "Never"
    case EveryMinute = "Every Minute"
    case EveryHour = "Every Hour"
    case EveryDay = "Every Day"
    case EveryWeek = "Every Week"
    case EveryMonth = "Every Month"
    case EveryYear = "Every Year"

    var description : String { return rawValue }

    static let allValues = [Never, EveryMinute, EveryHour, EveryDay, EveryWeek, EveryMonth, EveryYear]
}

var repeatTemp: RepeatInterval?

var repeatIntervalTemp: NSCalendarUnit?

var timeTemp: NSDate?

var toDateComponents = NSDateComponents()

Поскольку это работает для меня, это должно, вероятно, для остальных из вас. Пожалуйста, попробуйте и дайте мне знать, если есть проблема.

И, для точного решения этого вопроса, я бы посоветовал ниже.

(Возможно, Apple не думала о таком сценарии, но с этим можно справиться)

  1. Расписание уведомлений на 8:30 вечера
  2. Когда уведомление активируется, удалите его и запланируйте другое уведомление с другим идентификатором для NSCalendarUnitMinute эквивалент показан выше.
  3. Вуаля, это работает!! (Или не сделал?)

Использовать UNCalendarNotificationTrigger с DateComponents вместо NSCalendar:

var date = DateComponents()
date.hour = 8
date.minute = 30

let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
let content = UNNotificationContent()
// edit your content

let notification = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger)

Вы установили дату с DateComponents экземпляр и укажите, должно ли уведомление повторяться с repeats параметр UNCalendarNotificationTrigger инициализатор.

UNCalendarNotificationTrigger Документация

Просто на голову, что в Apple Docs есть опечатка (по состоянию на 6/13). Если вы используете NSDateComponents вместо DateComponents, вам нужно будет явно бросить date as DateComponents в dateMatching параметр.

В ответ на ваш комментарий я не верю, что поведение, которое вы хотите (изменяя частоту повторных уведомлений), поддерживается UNCalendarNotificationTrigger,

Потерпи меня, это мой первый пост.

Нам понадобился 1-минутный интервал повторения для нашего приложения в ios 10, и мы использовали в качестве обходного пути сочетание старой и новой инфраструктуры.

  1. планирование повторяющихся локальных уведомлений со старыми:

    UILocalNotification * ln = [[UILocalNotification alloc] init];
    ...
    ln.repeatInterval = kCFCalendarUnitMinute;
    ln.userInfo = @ {@ "alarmID":...}
    ...
    [[UIApplication sharedApplication] scheduleLocalNotification: ln];

Это создаст и запланирует обычные повторяющиеся LN, которые будут отображаться как UNNotification с UNLegacyNotificationTrigger

Я использовал alarmID для соединения старого и нового фреймворка.

Пытаться:

UNUserNotificationCenter* center = [UNUserNotificationCenter 

currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
    NSLog(@"----------------- PendingNotificationRequests %i -------------- ", (int)requests.count);
    for (UNNotificationRequest *req in requests) {
        UNNotificationTrigger *trigger = req.trigger;
        NSLog(@"trigger %@", trigger);
    }
}];
  1. реагирование на действия и запуск уведомлений, манипулирование центром уведомлений:

В новой структуре методы UNUserNotificationCenter: willPresentNotification: didReceiveNotificationResponse:

  1. Запрос авторизации и регистрации категории я сделал для обеих платформ обычным способом.

Надеюсь это поможет

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