UserNotification in 3 days then repeat every day/hour - iOS 10

前端 未结 2 1696
死守一世寂寞
死守一世寂寞 2020-12-11 04:07

UILocalNotification has been depreciated so I would like to update my code to the UserNotification framework:

let alertDays = 3.0
let alertSeconds = alertDay         


        
相关标签:
2条回答
  • 2020-12-11 04:40

    It seems like this is not supported, but to make a workaround you could use:

    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 combination with didReceive(_:withContentHandler:) you can use:

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

    I know this isn't optimal but it should work without using deprecated classes/methods. You use repeats: false since you are intercepting the notification just before the user receives it and creating a new notification. Additionally you can use it in combination with UNNotificationAction and UNNotificationCategory if you handle multiple notifications.

    0 讨论(0)
  • 2020-12-11 04:42

    This should work:

    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
            }
        })
    }
    
    0 讨论(0)
提交回复
热议问题