应用程序终止时UNUserNotificationCenter didReceive响应未被调用

我正在处理本地通知,但我遇到的问题是,当应用程序终止时,方法didReceive Response没有被调用,所以当我点击通知操作时它只是启动应用程序而没有做任何其他事情。 但当应用程序只在后台时,一切正常。 我的代码出了什么问题?

//MyClassNameViewController.swift

override func viewDidLoad() { super.viewDidLoad() UNUserNotificationCenter.current().delegate = self } func triggerAlarm1() { // Create an instance of notification center let center = UNUserNotificationCenter.current() // Sets the details of the notification let content = UNMutableNotificationContent() content.title = "Recorded Today's first alarm." content.body = "Be completely honest: how is your day so far?" content.sound = UNNotificationSound.default() content.categoryIdentifier = "notificationID1" // Set the notification to trigger everyday let triggerDaily = Calendar.current.dateComponents([.hour,.minute], from: myTimePicker1.date) let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true) // Deliver the notification let identifier = "UYLLocalNotification" let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger) center.add(request, withCompletionHandler: { (error) in if error != nil { // Just in case something went wrong print(error!) } }) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("didReceive Method called") if response.actionIdentifier == "actionOne" { let alertOne = UIAlertController(title: "First", message: "Some Message Here", preferredStyle: UIAlertControllerStyle.alert) let actionOne = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil) alertOne.addAction(actionOne) self.present(alertOne, animated: true, completion: nil) } completionHandler() } 

//AppDelegate.swift

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UNUserNotificationCenter.current().delegate = self // Request Authorisation UNUserNotificationCenter.current().requestAuthorization(options: [.alert , .sound , .badge]) { (Bool, error) in // insert code here } let actionOne = UNNotificationAction(identifier: "actionOne", title: "Open1", options: [.foreground]) let catogeryOne = UNNotificationCategory(identifier: "notificationID1", actions: [actionOne], intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([catogeryOne]) return true } 

在你的动作标识符中调用此函数,你就可以了!

  func alertAction() { let alertController = UIAlertController(title: "Hello", message: "This is cool!", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in // Do something with handler block })) let pushedViewControllers = (self.window?.rootViewController as! UINavigationController).viewControllers let presentedViewController = pushedViewControllers[pushedViewControllers.count - 1] presentedViewController.present(alertController, animated: true, completion: nil) } 

这太棒了!

 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("didReceive Method called") if response.actionIdentifier == "actionOne" { DispatchQueue.main.async(execute: { self.alertAction() }) } else if response.actionIdentifier == "actionTwo" { } else if response.actionIdentifier == "actionThree" { } completionHandler() } 

完全适用于Swift 3.0和Xcode 8.0。 我已经改变了视图控制器之间的所有连接。 我已经在初始的ViewController添加了一个NavigationController

将连接更改为<code/> show </ code>而不是<code> present modally </ code>

AppDelegate中:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. let center = UNUserNotificationCenter.current() center.delegate = self // Request Authorisation center.requestAuthorization(options: [.alert , .sound , .badge]) { (Bool, error) in // insert code here } let actionOne = UNNotificationAction(identifier: "actionOne", title: "Open1", options: [.foreground]) let catogeryOne = UNNotificationCategory(identifier: "notificationID1", actions: [actionOne], intentIdentifiers: [], options: []) let actionTwo = UNNotificationAction(identifier: "actionTwo", title: "Open2", options: [.foreground]) let catogeryTwo = UNNotificationCategory(identifier: "notificationID2", actions: [actionTwo], intentIdentifiers: [], options: []) let actionThree = UNNotificationAction(identifier: "actionThree", title: "Open3", options: [.foreground]) let catogeryThree = UNNotificationCategory(identifier: "notificationID3", actions: [actionThree], intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([catogeryOne, catogeryTwo, catogeryThree]) return true } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print("willPresent method called") completionHandler([.alert, .sound]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("didReceive Method called") if response.actionIdentifier == "actionOne" { DispatchQueue.main.async(execute: { self.alertAction() }) } else if response.actionIdentifier == "actionTwo" { } else if response.actionIdentifier == "actionThree" { } completionHandler() } func alertAction() { let alertController = UIAlertController(title: "Hello", message: "This is cool!", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in // Do something with handler block })) let pushedViewControllers = (self.window?.rootViewController as! UINavigationController).viewControllers let presentedViewController = pushedViewControllers[pushedViewControllers.count - 1] presentedViewController.present(alertController, animated: true, completion: nil) } 

此外,我已从viewDidLoad和其他地方删除了以前的所有建议。

在此处输入图像描述

更改您与show的连接,不要以模态方式显示。 如果您想在任何地方显示警报。 祝你好运