应用程序终止时未调用 UNUserNotificationCenter didReceive 响应
UNUserNotificationCenter didReceive response not called when app is terminated
我正在处理本地通知,但我遇到的问题是当应用程序终止时没有调用 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
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
,并且不要模态显示。如果您想在任何地方显示您的警报。祝你好运
我已在 AppDelegate 中遵守 UNUserNotificationCenterDelegate。一切都很简单,只是 在异步块中发布了我的通知,该通知将在 0.1 秒后 运行。
我在我的 HomeViewController 中观察 Notification.Name.LocalNotificationTapped 以在观察到此通知时更新 UI 例如显示一些弹出窗口等
您可以像呈现任何警报或呈现任何屏幕一样考虑异步块中的代码。
UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let notificationData = response.notification.request.content.userInfo
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
NotificationCenter.default.post(name: Notification.Name.LocalNotificationTapped, object: nil,userInfo: notificationData)
}
completionHandler()
}
我正在处理本地通知,但我遇到的问题是当应用程序终止时没有调用 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
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
,并且不要模态显示。如果您想在任何地方显示您的警报。祝你好运
我已在 AppDelegate 中遵守 UNUserNotificationCenterDelegate。一切都很简单,只是 在异步块中发布了我的通知,该通知将在 0.1 秒后 运行。
我在我的 HomeViewController 中观察 Notification.Name.LocalNotificationTapped 以在观察到此通知时更新 UI 例如显示一些弹出窗口等
您可以像呈现任何警报或呈现任何屏幕一样考虑异步块中的代码。
UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let notificationData = response.notification.request.content.userInfo
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
NotificationCenter.default.post(name: Notification.Name.LocalNotificationTapped, object: nil,userInfo: notificationData)
}
completionHandler()
}