首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地通知触发器仅持续10天,根据到期日期

本地通知触发器仅持续10天,根据到期日期
EN

Stack Overflow用户
提问于 2019-08-10 09:17:54
回答 1查看 293关注 0票数 1

最后10天需要触发本地通知根据我们的终止日期。例如,当前日期为今日日期(10-08-2019),到期日期为(20-08-2019)之间需要触发本地通知。为了测试目的,更改了设备到期日期范围内的设备日期(根据开始日期和终止日期之间的10天范围),.But无法在最后10天内获得本地通知。最后10天需要每天触发本地通知。我已经使用了下面的代码,但我没有得到结果。

代码语言:javascript
复制
func deviceExpiryReminder(){
    let dateString = "2010-08-20 00:00:00"
    let formatter : DateFormatter = DateFormatter()
    formatter.timeZone = NSTimeZone.local
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let date = formatter.date(from: dateString)
    if date != nil && date! > Date() {
        let message = "Device Expire Reminder"
        let title1 = "Your device is expire in {2} days"
        let title2 = "Your device is due to expire"
        let identifier = "DeviceExpire"
        //trigger for every day from configured days before
        for i in (0..<10) {
            let preTitleMsg = title1.replacingOccurrences(of: "{2}", with: String(i))
            var title = preTitleMsg
            if i == 0 {
                title = title2 + "today"
            } else if i == 1 {
                title = title2 + "tomorrow"
            }
            let userInfo = ["reminderType": "Device Expire",
                            "title": title,
                            "message": message,
                            "identifier": identifier]
            let timeInterval = TimeInterval(-1 * i * 24 * 3600)
            let triggerDate: Date = date!.addingTimeInterval(timeInterval)
            if triggerDate > Date() {
                createReminder(title, message, triggerDate, false, NSCalendar.Unit.day, nil, userInfo, identifier + String(i))
            }
        }
    }
}


 func createReminder(_ title: String, _ message: String, _ triggerDate: Date?, _ canRepeat: Bool, _ repeatInterval: NSCalendar.Unit, _ triggerDateComponents: DateComponents?, _ userInfo: [AnyHashable : Any]?, _ identifier: String) {
    if #available(iOS 10.0, *) {
        let content = UNMutableNotificationContent()
        content.title = title
        content.body = message
        content.sound = UNNotificationSound.default
        let center = UNUserNotificationCenter.current()
        var trigger:UNNotificationTrigger?
        if triggerDateComponents != nil {
            trigger = UNCalendarNotificationTrigger(dateMatching: triggerDateComponents!, repeats: canRepeat)
        } else {
            trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: (triggerDate?.timeIntervalSinceNow)!, repeats: canRepeat)
        }
        let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger)
        center.add(request) { (error) in
            if error != nil {
                print("Error")
            }else {
                print("Notification added")
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-21 06:37:41

您应该添加“第二天”和“更改的时区”作为系统区域标识符。

试着告诉我:

代码语言:javascript
复制
func deviceExpiryReminder(){
        let dateString = "2019-08-30 00:00:00"
        let formatter : DateFormatter = DateFormatter()
        formatter.timeZone = NSTimeZone.local
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = formatter.date(from: dateString)
        if date != nil && date! > Date() {
            let message = "Device Expire Reminder"
            let title1 = "Your device is expire in {2} days"
            let title2 = "Your device is due to expire"
            let identifier = "DeviceExpire"
            //trigger for every day from configured days before
            let numberofDays = self.daysBetweenDates(startDate: Date(), endDate: date ?? Date())
            for i in (0...numberofDays) {
                let preTitleMsg = title1.replacingOccurrences(of: "{2}", with: String(numberofDays - i))
                var title = preTitleMsg
                if numberofDays == i {
                    title = title2 + " today"
                } else if numberofDays - 1 == i{
                    title = title2 + " tomorrow"
                }
                let userInfo = ["reminderType": "Device Expire",
                                "title": title,
                                "message": message,
                                "identifier": identifier]
                var calendar = Calendar.current
                calendar.timeZone = TimeZone(identifier: self.getCurrentTimeZone())!
                let currentDay  = Date()
                let nextDate = Calendar.current.date(byAdding: .day, value: i, to: currentDay)
                if nextDate! >= Date() {
                    createReminder(title, message, nextDate, false, NSCalendar.Unit.day, nil, userInfo, identifier + String(i))
                }
            }
        }
    }
    func getCurrentTimeZone() -> String{
        return String (TimeZone.current.identifier)
    }
    func createReminder(_ title: String, _ message: String, _ triggerDate: Date?, _ canRepeat: Bool, _ repeatInterval: NSCalendar.Unit, _ triggerDateComponents: DateComponents?, _ userInfo: [AnyHashable : Any]?, _ identifier: String) {
        if #available(iOS 10.0, *) {
            let content = UNMutableNotificationContent()
            content.title = title
            content.body = message
            content.sound = UNNotificationSound.default
            let center = UNUserNotificationCenter.current()
            // *** create calendar object ***
            var calendar = Calendar.current
            calendar.timeZone = TimeZone(identifier: self.getCurrentTimeZone())!
            let components = calendar.dateComponents([.month, .hour, .year, .day], from: triggerDate!)
            print("trigger dates one by one : \(triggerDate!)")
           let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: canRepeat)
            let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger)
            center.add(request) { (error) in
                if error != nil {
                    print("Error")
                }else {
                    print("Notification added")
                }
            }
        }
    }

func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
        let daysBetween = Calendar.current.dateComponents([.day], from: startDate, to: endDate)
        print(daysBetween.day!)
        return daysBetween.day!
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57440873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档