¿Cómo configuro un NSCalendarUnitMinute repeatInterval en iOS 10 UserNotifications?

En UILocalNotification utilizamos NSCalendarUnitMinute como repetición ….. pero no puedo encontrar en iOS 10 UserNotification doc … ¿Cómo puedo usar NSCalendarUnitMinute como repetición en iOS 10 UserNotification ?

aquí está el código que progtwigrá la notificación local a las 8:30 p.m. y se repetirá después de cada minuto.

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

Aunque parece que el viejo marco de notifications tuvo un mejor soporte con respecto a esto, ¡es solo hasta que nos damos count de que el nuevo es mejor!

Tuve problemas similares, y a continuación se muestra una muestra de cómo las notifications anteriores pueden ir de la mano con las nuevas.

Para estar en un lado más seguro, esto es 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 } } } 

Aunque esto no es exhaustivo, casi he cubierto todo de un minuto a un año.

Y para ser más detallado,

 // 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() 

Como esto funciona para mí, probablemente debería ser para el rest de ustedes. Intenta y avísame si hay un problema.

Y, para la solución exacta a esta pregunta, aconsejaría lo siguiente.

(Probablemente, Apple no pensó en ese escenario, pero puede manejarse)

  1. Programe una notificación para las 8:30 p.m.
  2. Cuando se activa la notificación, elimínela y programe otra notificación con un identificador diferente, para el equivalente NSCalendarUnitMinute muestra arriba.
  3. ¡Voila, funciona! (¿O no lo hizo?)

Use un UNCalendarNotificationTrigger con DateComponents lugar de 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) 

Configura la date con una instancia de DateComponents y especifica si la notificación debería repetirse con el parámetro de UNCalendarNotificationTrigger inicializador UNCalendarNotificationTrigger .

UNCalendarNotificationTrigger Documentation

Solo hay una pista de que hay un error tipográfico en Apple Docs (a partir del 6/13). Si utiliza NSDateComponents lugar de DateComponents , deberá emitir explícitamente su date as DateComponents en el parámetro dateMatching .

En respuesta a su comentario, no creo que el comportamiento que desee (cambiar la frecuencia de su notificación repetida) sea compatible con UNCalendarNotificationTrigger .

Bear conmigo esta es mi primera publicación.

Necesitábamos el intervalo de repetición de 1 minuto para nuestra aplicación en ios 10, y usamos como solución una combinación del marco antiguo y el nuevo.

  1. Progtwigr las notifications locales repetitivas con las antiguas:

    UILocalNotification * ln = [[UILocalNotification alloc] init];

    ln.repeatInterval = kCFCalendarUnitMinute;
    ln.userInfo = @ {@ "alarmID": …}

    [[UIApplication shanetworkingApplication] scheduleLocalNotification: ln];

Esto creará y progtwigrá los LN de repetición habituales que aparecerán como UNNotification con un UNLegacyNotificationTrigger

Utilicé un alarmID para conectar el marco antiguo y el nuevo.

Tratar:

 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. respondiendo a acciones y notifications de fuego, manipulando el centro de notifications:

Con el nuevo marco UNUserNotificationCenter methods: willPresentNotification: didReceiveNotificationResponse:

  1. Solicitar la autorización y el logging de categorías que hice para ambos frameworks de la manera habitual.

Espero que esto ayude