安排通知在特定时间触发 - Swift
Schedule Notification to trigger at specific time - Swift
在我的应用程序中,我有一个让用户选择时间的 uidatepickerview。目前在我的代码中,我将那个时间选择为 dateA
。然后我循环遍历在单独的 uitableview 中选择的所有日期,并检查它们是否等于今天(例如星期二)。如果日期相同,那么我会在选定的时间发送一条通知,该时间被传递为 dateA
。但是,当我尝试发送通知时,它没有发送。
这是我的代码片段,展示了我的尝试:
var dateA: Date? = nil//where selected time is kept
var weekdaysChecked = [String]()//where selected weekdays are kept
var alarms = [Alarm]() {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (didAllow, error) in
})
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "alarmCell", for: indexPath) as! DisplayAlarmCell
let row = indexPath.row
let alarm = alarms[row]
let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE"//"EE" to get short style
let dayInWeek = dateFormatter.string(from: date)
if(alarms.count == 40) {
self.navigationItem.rightBarButtonItem?.isEnabled = false
tableView.reloadData()
}
cell.alarmTitle.text = alarm.alarmLabel
cell.clockTitle.text = alarm.time
for weekdays in weekdaysChecked {
if(dayInWeek == weekdays){
let content = UNMutableNotificationContent()
content.title = alarm.alarmLabel!
content.subtitle = alarm.time!
content.sound = UNNotificationSound(named: "Spaceship_Alarm.mp3")
let trigger = Calendar.current.dateComponents([.hour,.minute], from: dateA!)
let triggerNotif = UNCalendarNotificationTrigger(dateMatching: trigger, repeats: false)
let triggerRequest = UNNotificationRequest(identifier: "AlarmNotif", content: content, trigger: triggerNotif)
UNUserNotificationCenter.current().add(triggerRequest, withCompletionHandler: nil)
print("This is the correct day.")
}
}
尝试在此处添加所有组件:
let trigger = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: dateA!)
并将这些方法添加到您的 AppDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) {
completionHandler(UNNotificationPresentationOptionBadge)
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
completionHandler()
}
另外我会检查你选择的日期是否因为你的设备的时区不同而被弄乱。
希望对您有所帮助
假设您看到了 "This is the correct day" 消息,一个候选问题是您的 UNNotificationRequest
使用了固定标识符。正如 the docs 所说,"if identifier is not unique, notifications are not delivered"。
此外,如果 requestAuthorization
调用失败,我建议添加一条错误消息。现在,如果权限因任何原因失败,您不会知道,也不会发送任何通知。
无关,cellForRowAt
不是创建通知的正确位置。如果用户没有碰巧将特定单元格滚动到视图中,则不会创建通知。如果用户将一个单元格滚动到视图之外然后又回到视图中,您将尝试再次创建相同的通知请求。最重要的是,一个单元格是否恰好出现(以及它是否稍后再次出现)与是否应该创建通知无关。
通知的创建属于您更新模型的地方(或响应某些用户操作,例如选中复选框等)。
在我的应用程序中,我有一个让用户选择时间的 uidatepickerview。目前在我的代码中,我将那个时间选择为 dateA
。然后我循环遍历在单独的 uitableview 中选择的所有日期,并检查它们是否等于今天(例如星期二)。如果日期相同,那么我会在选定的时间发送一条通知,该时间被传递为 dateA
。但是,当我尝试发送通知时,它没有发送。
这是我的代码片段,展示了我的尝试:
var dateA: Date? = nil//where selected time is kept
var weekdaysChecked = [String]()//where selected weekdays are kept
var alarms = [Alarm]() {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (didAllow, error) in
})
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "alarmCell", for: indexPath) as! DisplayAlarmCell
let row = indexPath.row
let alarm = alarms[row]
let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE"//"EE" to get short style
let dayInWeek = dateFormatter.string(from: date)
if(alarms.count == 40) {
self.navigationItem.rightBarButtonItem?.isEnabled = false
tableView.reloadData()
}
cell.alarmTitle.text = alarm.alarmLabel
cell.clockTitle.text = alarm.time
for weekdays in weekdaysChecked {
if(dayInWeek == weekdays){
let content = UNMutableNotificationContent()
content.title = alarm.alarmLabel!
content.subtitle = alarm.time!
content.sound = UNNotificationSound(named: "Spaceship_Alarm.mp3")
let trigger = Calendar.current.dateComponents([.hour,.minute], from: dateA!)
let triggerNotif = UNCalendarNotificationTrigger(dateMatching: trigger, repeats: false)
let triggerRequest = UNNotificationRequest(identifier: "AlarmNotif", content: content, trigger: triggerNotif)
UNUserNotificationCenter.current().add(triggerRequest, withCompletionHandler: nil)
print("This is the correct day.")
}
}
尝试在此处添加所有组件:
let trigger = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: dateA!)
并将这些方法添加到您的 AppDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) {
completionHandler(UNNotificationPresentationOptionBadge)
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
completionHandler()
}
另外我会检查你选择的日期是否因为你的设备的时区不同而被弄乱。
希望对您有所帮助
假设您看到了 "This is the correct day" 消息,一个候选问题是您的 UNNotificationRequest
使用了固定标识符。正如 the docs 所说,"if identifier is not unique, notifications are not delivered"。
此外,如果 requestAuthorization
调用失败,我建议添加一条错误消息。现在,如果权限因任何原因失败,您不会知道,也不会发送任何通知。
无关,cellForRowAt
不是创建通知的正确位置。如果用户没有碰巧将特定单元格滚动到视图中,则不会创建通知。如果用户将一个单元格滚动到视图之外然后又回到视图中,您将尝试再次创建相同的通知请求。最重要的是,一个单元格是否恰好出现(以及它是否稍后再次出现)与是否应该创建通知无关。
通知的创建属于您更新模型的地方(或响应某些用户操作,例如选中复选框等)。