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

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

在此处输入图像描述

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

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

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] (作为提醒类的属性)来保存通知应该触发的星期几的信息。

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

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

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

  //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)安排通知。

  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) } } }