首页 文章

重复本周特定日期的本地通知(Swift 3 IOS 10)

提问于
浏览
7

我正在尝试为一周中的特定日期(例如星期一,星期三等)安排本地通知,然后每周重复一次 . 这是用于设置通知的屏幕的外观:

enter image description here

用户可以选择通知时间和重复日期 .

我调度单个非重复通知的方法如下所示:

static func scheduleNotification(reminder: Reminder) {
    // Setup notification content.
    let content = UNMutableNotificationContent()

    //content.title = NSString.localizedUserNotificationString(forKey: "Reminder", arguments: nil)
    content.body = NSString.localizedUserNotificationString(forKey: reminder.reminderMessage, arguments: nil)
    content.sound = UNNotificationSound.default()


    // Configure the triger for specified time.
    // 
    let dateComponentes = reminder.dateComponents
    // TODO: Configure repeating alarm

    // For the testing purposes we will not repeat the reminder
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponentes, repeats: false)

    // Create the request object.
    let request = UNNotificationRequest(identifier: "\(reminder.reminderId)", content: content, trigger: trigger)

    // Schedule the request.
    let notificationCenter = UNUserNotificationCenter.current()
    notificationCenter.add(request) { (error: Error?) in
        if let theError = error {
            print(theError.localizedDescription)
        }
    }
}

日期组件从UIDatePicker小部件中提取并存储在提醒类中:

let date = reminderTimeDatePicker.date.addingTimeInterval(60 * 60 * 24 * 7)
let components = Calendar.current.dateComponents([.weekday, .hour, .minute], from: date)
...
reminder.dateComponents = components

我有一个数组 selectedDays[Int] (作为提醒类的属性)来保存通知应该触发的星期几的信息 .

如何在一周中的特定日期安排通知以及如何每周重复一次?

即使是一条评论也会有所帮助,并提前感谢您 .

2 回答

  • 3

    您可以使用以下函数从所选的选择器值中获取日期:

    //Create Date from picker selected value.
        func createDate(weekday: Int, hour: Int, minute: Int, year: Int)->Date{
    
            var components = DateComponents()
            components.hour = hour
            components.minute = minute
            components.year = year
            components.weekday = weekday // sunday = 1 ... saturday = 7
            components.weekdayOrdinal = 10
            components.timeZone = .current
    
            let calendar = Calendar(identifier: .gregorian)
            return calendar.date(from: components)!
        }
    
        //Schedule Notification with weekly bases.
        func scheduleNotification(at date: Date, body: String, titles:String) {
    
            let triggerWeekly = Calendar.current.dateComponents([.weekday,.hour,.minute,.second,], from: date)
    
            let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true)
    
            let content = UNMutableNotificationContent()
            content.title = titles
            content.body = body
            content.sound = UNNotificationSound.default()
            content.categoryIdentifier = "todoList"
    
            let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger)
    
            UNUserNotificationCenter.current().delegate = self
            //UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
            UNUserNotificationCenter.current().add(request) {(error) in
                if let error = error {
                    print("Uh oh! We had an error: \(error)")
                }
            }
        }
    

    从选择器传递选择器小时,分钟和年份中获取值,选定的工作日为(星期日= 1,星期一= 2,星期二= 3,星期三= 4,星期四= 5,星期五= 6,星期六= 7)以运行 func createDate(weekday: Int, hour: Int, minute: Int, year: Int) 在每周基础上获得通知开火日期,并在获得日期呼叫功能 func scheduleNotification(at date: Date, body: String, titles:String) 以安排通知 .

  • 13
    let content = UNMutableNotificationContent()
     content.title = NSString.localizedUserNotificationString(forKey: "Wake up!", arguments: nil)
     content.body = NSString.localizedUserNotificationString(forKey: "Rise and shine! It's morning time!",
                                                                    arguments: nil)
     content.categoryIdentifier = "TIMER_EXPIRED"
    
     let weekdaySet = [6,5]
    
       for i in weekdaySet {
    
            var dateInfo = DateComponents()
            dateInfo.hour = 16
            dateInfo.minute = 44
            dateInfo.weekday = i
            dateInfo.timeZone = .current
    
            let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: true)
            let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
            center.add(request) { (error : Error?) in
    
            if let theError = error {
                    print(theError.localizedDescription)
                    }
                }
           }
    

相关问题