如何解决从 DatePicker 设置时间以进行提醒
Example(我尝试创建这样的东西。 现在你可以看到,这里你可以选择时间和间隔)
我创建了提醒,用户可以选择接收通知的频率(每 2 天、每 3 天等),但我也希望用户能够选择时间。我知道如何创建在选定时间发送通知的提醒,但我必须使用 UNCalendarNotificationTrigger
,问题是我使用了 UNTimeIntervalNotificationTrigger
。谢谢
@IBOutlet weak var picker: UIPickerView!
@IBOutlet weak var timePicker: UIDatePicker!
@IBAction func setReminderBtnTapped(_ sender: Any) {
let content = UNMutableNotificationContent()
content.title = "Test"
content.body = "Blablabla"
content.sound = .default
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval((picker.selectedRow(inComponent: 1)+1)*(24*3600)),repeats: true)
let request = UNNotificationRequest(identifier: "blabla.reminder",content: content,trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error) in
if let error = error {
print("error")
}
}
print("Notification added")
}
解决方法
试试这个代码:
private func setLocalNotification(hour: Int,minute: Int,completionHandler: @escaping (Bool) -> Void) {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert,.badge,.sound]) { [weak self] (granted,error) in
guard let self = self else {
return
}
let center = UNUserNotificationCenter.current()
center.removeAllPendingNotificationRequests()
guard error == nil else {
completionHandler(false)
return
}
if granted {
let content = UNMutableNotificationContent()
content.title = "title"
content.sound = UNNotificationSound.default
content.badge = 1
var dateComponents = DateComponents()
dateComponents.hour = hour
dateComponents.minute = minute
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents,repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString,content: content,trigger: trigger)
center.add(request)
completionHandler(true)
return
}
completionHandler(false)
}
}
你可以像这样通过从 datePicker 获取日期来调用:
let date = self.timepPicker.date
let calendar = Calendar.current
let hour = calendar.component(.hour,from: date) // get hour
let minutes = calendar.component(.minute,from: date) // get minute
self.setLocalNotification(hour: hour,minute: minutes) { [weak self] isSet in
guard let self = self else {
return
}
if !isSet {
let center = UNUserNotificationCenter.current()
center.removeAllPendingNotificationRequests() // remove previus notification
}
}
更新答案 每 n 天重复 X 次:
create extension from date for create simple date getDateComponents:
extension Date {
public func getDateComponents() -> DateComponents {
let dateComponents = Calendar.current.dateComponents([.hour,.minute,.second,.day],from: self)
return dateComponents
}
}
并更新 setLocalNotification 函数:
private func setLocalNotification(repeatCount: Int,jumpNextDay: Int,hour: Int,minute: Int) {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert,.sound]) { (granted,error) in
let center = UNUserNotificationCenter.current()
center.removeAllPendingNotificationRequests()
guard error == nil else {
return
}
if granted {
let content = UNMutableNotificationContent()
content.title = "title"
content.sound = UNNotificationSound.default
content.badge = 1
// create date from hour and minute based on current
let firstDate = Calendar.current.date(bySettingHour: hour,minute: minute,second: 0,of: Date())!
let firstTimeInterval = firstDate.timeIntervalSince1970 // get timeInterval
// example run for
// repeat count 5 and jump 2
// 2 4 6 8 10
for i in stride(from: jumpNextDay,to: jumpNextDay * (repeatCount + 1),by: jumpNextDay) {
// create next day
// 86400 next time interval added to first time interval
// create time interval from first date
// 2 next day = firstTimeInterval + 2 * 86400
let timeIntervalForTrigger = firstTimeInterval + Double((i * 86400))
// create date from time interval
let date = Date.init(timeIntervalSince1970: timeIntervalForTrigger)
// create datecomponnet
let dateComponents = date.getDateComponents()
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents,repeats: false)
let request = UNNotificationRequest(identifier: UUID().uuidString,trigger: trigger)
center.add(request)
}
}
}
}
并调用:
let date = self.timepPicker.date
let calendar = Calendar.current
let hour = calendar.component(.hour,from: date) // get hour
let minutes = calendar.component(.minute,from: date) // get minute
self.setLocalNotification(repeatCount: 2,jumpNextDay: 2,hour: hour,minute: minutes)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。