2016-07-14 147 views
6

UILocalNotification è stato deprezzato quindi vorrei aggiornare il mio codice per il quadro UserNotification:UserNotification in 3 giorni, per poi ripetere ogni giorno/ora - iOS 10

let alertDays = 3.0 
let alertSeconds = alertDays * 24.0 * 60.0 * 60.0 

let localNotification:UILocalNotification = UILocalNotification() 

localNotification.alertAction = "Reminder" 
localNotification.alertTitle = "Reminder Title" 
localNotification.alertBody = "Reminder Message" 
localNotification.fireDate = Foundation.Date(timeIntervalSinceNow: alertSeconds) 
localNotification.repeatInterval = .day    
UIApplication.shared().scheduleLocalNotification(localNotification) 

Come posso impostare una ripetizione giornaliera o oraria simile con il framework UserNotification dopo aver atteso la notifica iniziale?

let alertDays = 3.0 
let alertSeconds = alertDays * 24.0 * 60.0 * 60.0 

let content: UNMutableNotificationContent = UNMutableNotificationContent() 

content.title = "Reminder Title" 
content.subtitle = "Reminder Subtitle" 
content.body = "Reminder Message" 

let calendar = Calendar.current 

let alarmTime = Foundation.Date(timeIntervalSinceNow: alertSeconds) 
let alarmTimeComponents = calendar.components([.day, .hour, .minute], from: alarmTime) 

let trigger = UNCalendarNotificationTrigger(dateMatching: alarmTimeComponents, repeats: true) 

let request = UNNotificationRequest(identifier: workoutAlarmIdentifier, 
             content: content, 
             trigger: trigger) 

UNUserNotificationCenter.current().add(request) 
    { 
     (error) in // ... 
    } 
+0

correlati? [Come si imposta NSCalendarUnitMinute repeatInterval su iOS 10 UserNotifications?] (Http://stackoverflow.com/q/37804287/2415822) – JAL

+0

Correlato ma sembra che non ci sia .repeatInterval dalle UILocalOffice deprezzate supportate in UserNotifications. Alla ricerca di come questo sarà gestito nel nuovo framework in modo da poter spostare il mio codice da quello deprecato. –

+0

Suggerisco di sollevare un radar – Wain

risposta

2

Sembra che questo non è supportato, ma per fare una soluzione è possibile utilizzare:

let alertDays = 3.0 
let daySeconds = 86400 
let alertSeconds = alertDays * daySeconds 

let content: UNMutableNotificationContent = UNMutableNotificationContent() 

content.title = "Reminder Title" 
content.subtitle = "Reminder Subtitle" 
content.body = "Reminder Message" 

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: (alertSeconds), repeats: false) 

let request = UNNotificationRequest(identifier: workoutAlarmIdentifier, 
            content: content, 
            trigger: trigger) 

UNUserNotificationCenter.current().add(request) 
{ 
    (error) in // ... 
} 

in combinazione con didReceive(_:withContentHandler:) è possibile utilizzare:

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: (daySeconds), repeats: false) 

So che questo isn È ottimale ma dovrebbe funzionare senza utilizzare classi/metodi deprecati. Si utilizzano le ripetizioni: false poiché si sta intercettando la notifica appena prima che l'utente la riceva e creando una nuova notifica. Inoltre puoi usarlo in combinazione con UNNotificationAction e UNNotificationCategory se gestisci più notifiche.

+1

Aspetta un minuto ... La domanda stava chiedendo delle notifiche locali, non delle notifiche remote, che sono le estensioni del servizio di notifica. Non è possibile utilizzarli su UNNotification's pianificato localmente, giusto? – CMash

+0

In realtà sembra che sia necessario impostare "mutable-content" in una notifica remota per far sì che venga gestita dall'estensione del servizio in modo che non tutte le notifiche possano passare attraverso di essa. – CMash

0

Questo dovrebbe funzionare:

func addNotificationForAlarm(alarm: MyAlarm) { 

    let myAlarmNotifContent = UNMutableNotificationContent() 
    myAlarmNotifContent.title = "Reminder" 
    myAlarmNotifContent.body = alarm.activity 
    myAlarmNotifContent.sound = UNNotificationSound.default() 

    if alarm.repeatDays.count == 1 { 

    } else { 

     for index in 1...alarm.repeatDays.count { 
      createNotif(date: alarm.date, weekDay: index, content: myAlarmNotifContent) 
     } 
    } 

} 

private func createNotif(date: Date, weekDay: Int, content: UNNotificationContent) { 

    var dateComponent = DateComponents() 
    dateComponent.weekday = weekDay 
    dateComponent.hour = Calendar.current.dateComponents([.hour], from: date).hashValue 
    dateComponent.minute = Calendar.current.dateComponents([.minute], from: date).hashValue 

    let myAlarmTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: true) 

    setupNotificationSettings() 

    let identifier = "Your-Notification" 
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: myAlarmTrigger) 
    let center = UNUserNotificationCenter.current() 
    center.add(request, withCompletionHandler: { (error) in 
     if error != nil { 
      //TODO: Handle the error 
     } 
    }) 
}