关于通知操作的重新安排通知不起作用Swift。 解决了

当用户点击等待通知操作时,我正在尝试重新安排通知。 当triggerNotification()时,第一次Date由日期选择器提供,但是当响应调用它时,从一个时间间隔获取日期。 在case:waitActionIdentifier:方法case:waitActionIdentifier:我设置newDate并将其传递给triggerNotification参数。 延迟通知永远不会到来。 我不明白它是否是一个函数调用问题,或者因为我看到的newDate是正确的打印它。 这是代码:

 class ViewController: UIViewController { @IBAction func datePickerDidSelectNewDate(_ sender: UIDatePicker) { let selectedDate = sender.date let delegate = UIApplication.shared.delegate as? AppDelegate // delegate?.scheduleNotification(at: selectedDate) delegate?.triggerNotification(at: selectedDate) } } 

和AppDelegate

 import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UNUserNotificationCenter.current().delegate = self configureCategory() triggerNotification(at: Date()) requestAuth() return true } let category = "Notification.Category.Read" private let readActionIdentifier = "Read" private let waitActionIdentifier = "Wait" private func requestAuth() { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (success, error) in if let error = error { print("Request Authorization Failed (\(error), \(error.localizedDescription))") } } } func triggerNotification(at date: Date) { // Create Notification Content let notificationContent = UNMutableNotificationContent() //compone a new Date components because components directly from Date don't work let calendar = Calendar(identifier: .gregorian) let components = calendar.dateComponents(in: .current, from: date) let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute) //create the trigger with above new date components, with no repetitions let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: false) // Configure Notification Content notificationContent.title = "Hello" notificationContent.body = "Kindly read this message." // Set Category Identifier notificationContent.categoryIdentifier = category // Add Trigger // let notificationTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 10.0, repeats: false) // // Create Notification Request let notificationRequest = UNNotificationRequest(identifier: "test_local_notification", content: notificationContent, trigger: trigger) // // Add Request to User Notification Center UNUserNotificationCenter.current().add(notificationRequest) { (error) in if let error = error { print("Unable to Add Notification Request (\(error), \(error.localizedDescription))") } } } private func configureCategory() { // Define Actions let read = UNNotificationAction(identifier: readActionIdentifier, title: "Read", options: []) let wait = UNNotificationAction(identifier: waitActionIdentifier, title : "Wait", options: []) // Define Category let readCategory = UNNotificationCategory(identifier: category, actions: [read, wait], intentIdentifiers: [], options: []) // Register Category UNUserNotificationCenter.current().setNotificationCategories([readCategory]) } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { switch response.actionIdentifier { case readActionIdentifier: print("Read tapped") case waitActionIdentifier: let actualDate = Date() let newDate: Date = Date(timeInterval: 10, since: actualDate) self.triggerNotification(at: newDate) print("Wait tapped") print(actualDate) print(newDate) default: print("Other Action") } completionHandler() } } 

在与@ VIP-DEV和@Honey尝试不同的事情之后,我终于了解了在通知中点击等待操作按钮时重新安排通知的问题。 在func triggerNotification(at date: Date)范围内我得到了没有秒的日期组件, let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute)所以当函数的新调用是使用let newDate: Date = Date(timeInterval: 5.0 , since: actualDate)日期时,当然没有考虑那些秒并且使用的日期已经过去了,因此……没有重新安排。 let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute, second: components.second)是包含组件的最终日期包括秒。