如何设置从特定日期起每隔7、14、28天重复的本地通知

时间:2019-09-13 11:23:48

标签: ios swift push-notification

我需要每7、14、28天推送一次本地通知。 我已成功设置为每周推送(7天) 我不完全了解DateComponents如何工作。 IE:我需要每分钟重复一次通知,我这样做Calendar.current.dateComponents([.second], from: fireDate)在重复14天,28天后如何工作。

// datetime is timestamp which I can choose: ie: May 02, 2029

let fireDate = Date(timeIntervalSince1970: Double(truncating: datetime) / 1000)
        let fireDateComps = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fireDate)

        let content = UNMutableNotificationContent()
        content.title = title
        content.body = note
        content.sound = UNNotificationSound.default
        content.categoryIdentifier = "timer.category"

        var triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fireDate)
        var repeats = false
        switch (recurring) {
        case "weekly":
            triggerDate = Calendar.current.dateComponents([ .weekday , .hour , .minute , .second], from: fireDate)
            repeats = true
            print("reminder repeat weekly")
        case "every_two_weeks":
            print("triggerDate 1 \(fireDate)")
            let aaa = Calendar.current.date(byAdding: .day, value: 14, to: fireDate)
            print("triggerDate 2 \(aaa)")
            triggerDate = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: aaa!)
            print("triggerDate 3 \(triggerDate)")
            repeats = true
            print("reminder repeat every_two_weeks")
        case "every_four_weeks":
            triggerDate = Calendar.current.dateComponents([ .month , .hour , .minute , .second], from: fireDate)
            repeats = true
            print("reminder repeat every_four_weeks")
        default:
            triggerDate = Calendar.current.dateComponents([ .year, .month, .day , .hour , .minute , .second], from: fireDate)
            repeats = false
            print("No recurring")
        }
        let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: repeats)
        print("trigger \(trigger), firstRepeatingDate \(triggerDate)")
        let request = UNNotificationRequest(identifier: id,
                                            content: content, trigger: trigger)
        self.center.add(request) {(error) in
            if let error = error {
                Log.nonFatal("Save notification failed \(String(describing: error))")
                reject("reminder", "Save reminder notification failed", error)
            }
            print("Saved recurring notification")
            resolve(true)
        }

2 个答案:

答案 0 :(得分:0)

自从我使用这些api已经有一段时间了,但是根据文档,这里是其中的两个简单示例(您使用的是我建议的一个):

// UNCalendarNotificationTrigger (Trigger at specific date & time)
// This example fires a notification every day at 08:30

var date    = DateComponents()
date.hour   = 8
date.minute = 30 
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)

/* I guess date.day = 1 would fire at the 1st day of each month
   whereas date.weekOfMonth = 2 would fire at the second week of each month etc 
*/

您可能需要定期点火:

// UNTimeIntervalNotificationTrigger (Trigger after an amount of time has elapsed)
// This example fires a notification every 14 days (14d * 24h * 60m * 60s)

let days = 14
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(days * 24 * 60 * 60), repeats: true)

答案 1 :(得分:0)

我已经解决了这个问题。

func calendarAddNotification(id: String, title: String, datetime: NSNumber, note: String, recurring: String) {

let fireDate = Date(timeIntervalSince1970: Double(truncating: datetime) / 1000)

    let content = UNMutableNotificationContent()
    content.title = title
    content.body = note
    content.sound = UNNotificationSound.default
    content.categoryIdentifier = "timer.category"

    // setup normal notification
    let triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fireDate)
    let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false)
    let request = UNNotificationRequest(identifier: id,
                                        content: content, trigger: trigger)
    self.center.add(request) {(error) in
        if let error = error {
            Log.nonFatal("Save notification failed \(String(describing: error))")
        } else {
            print("Saved notification")
        }
    }
    // non-recurring notification, return
    if (!["weekly", "every_two_weeks", "every_four_weeks"].contains(recurring)) {
        print("No recurring notification")
        return
    }

    // recurring notification
    var interval = 0
    switch (recurring) {
    case "weekly":
        interval = 7
        print("reminder repeat weekly")
    case "every_two_weeks":
        interval = 14
        print("reminder repeat every_two_weeks")
    case "every_four_weeks":
        interval = 28
        print("reminder repeat every_four_weeks")
    default:
        print("No recurring")
    }
    // add interval day to the fireDate
    let recurringDateComponent = Calendar.current.date(byAdding: .day, value: interval, to: fireDate)
    let recurringTrigger = UNTimeIntervalNotificationTrigger(timeInterval: recurringDateComponent!.timeIntervalSinceNow, repeats: true)
    let recurringRequest = UNNotificationRequest(identifier: "recurring_" + id,
                                        content: content, trigger: recurringTrigger)
    self.center.add(recurringRequest) { (error) in
        if let error = error {
            Log.nonFatal("Save recurring notification failed \(String(describing: error))")
        } else {
            print("Saved recurring notification")
        }
    }
}