所以我可以安排这样的通知;
//iOS 10 Notification if #available(iOS 10.0,*) { var displayDate: String { let dateFormatter = DateFormatter() dateFormatter.dateStyle = DateFormatter.Style.full return dateFormatter.string(from: datePicker.date as Date) } let notif = UNMutableNotificationContent() notif.title = "I am a Reminder" notif.subtitle = "\(displayDate)" notif.body = "Here's the body of the notification" notif.sound = UNNotificationSound.default() notif.categoryIdentifier = "reminderNotification" let today = NSDate() let interval = datePicker.date.timeIntervalSince(today as Date) let notifTrigger = UNTimeIntervalNotificationTrigger(timeInterval: interval,repeats: false) let request = UNNotificationRequest(identifier: "reminderNotif",content: notif,trigger: notifTrigger) UNUserNotificationCenter.current().add(request,withCompletionHandler: { error in if error != nil { print(error) // completion(Success: false) } else { //completion(Sucess: true) } }) }
我已经在appDelegate中请求了权限,并且使用通知扩展程序的自定义视图显示通知正常.
我在appDelegate中为通知类别添加了通知操作;这些也出现了.
//Notifications Actions private func configureUserNotifications() { if #available(iOS 10.0,*) { let tomorrowAction = UNNotificationAction(identifier: "tomorrowReminder",title: "Remind Me Tomorrow",options: []) let dismissAction = UNNotificationAction(identifier: "dismissReminder",title: "Dismiss",options: []) let category = UNNotificationCategory(identifier: "reminderNotification",actions: [tomorrowAction,dismissAction],intentIdentifiers: [],options: [.customDismissAction]) UNUserNotificationCenter.current().setNotificationCategories([category]) } else { // Fallback on earlier versions } }
我在通知扩展名.plist文件中设置了相同的类别.在通知扩展中,我有以下内容在用户点击操作时更改文本.
//Handle Notification Actions And Update Notification Window private func didReceive(_ response: UNNotificationResponse,completionHandler done: (UNNotificationContentExtensionResponSEOption) -> Void) { if response.actionIdentifier == "tomorrowReminder" { print("Tomrrow Button Pressed") subLabel.text = "Reminder For Tomorrow" subLabel.textColor = UIColor.blue done(.dismissAndForwardAction) } if response.actionIdentifier == "dismissReminder" { print("Dismiss Button Pressed") done(.dismiss) } else { print("Else response") done(.dismissAndForwardAction) } }
但是,文本没有改变,也没有调用任何语句;
在appDelegate中我有以下内容;
func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { if #available(iOS 10.0,*) { UNUserNotificationCenter.current().delegate = self configureUserNotifications() } } extension AppDelegate: UNUserNotificationCenterDelegate { @available(iOS 10.0,*) private func userNotificationCenter(_ center: UNUserNotificationCenter,willPresent notification: UNNotification,withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert,.sound]) } @available(iOS 10.0,didReceive response: UNNotificationResponse,withCompletionHandler completionHandler: () -> Void) { print("Recieved Action For \(response.actionIdentifier)") if response.actionIdentifier == "tomorrowReminder" { print("Tomorrow Reminder") //Set new reminder for tomorrow using the notification content title completionHandler() } if response.actionIdentifier == "dismissReminder" { print("Dismiss Reminder...") completionHandler() } } }
这些函数都不是在appDelegate中实际调用的.我不确定更新扩展视图的问题是否与应用程序委托有关.我不这么认为,我已经关注了Apple的WWDC视频以及其他教程并查看了文档API并且无法弄清楚;
>为什么通知扩展文本标签不更新?
>为什么appDelegate中的函数没有被调用?
>我如何使用app delegate中的通知内容来使用
为了行动?
PS:过去几周我一直在研究并试图解决这个问题,看起来相当直接,我不确定我错过了什么.我知道我不是唯一有这些问题的人.
解决方法
我没有检查你的整个代码,但至少,这些函数头需要改变如下:
func userNotificationCenter(_ center: UNUserNotificationCenter,withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { func userNotificationCenter(_ center: UNUserNotificationCenter,withCompletionHandler completionHandler: @escaping () -> Void) { func didReceive(_ response: UNNotificationResponse,completionHandler done: @escaping (UNNotificationContentExtensionResponSEOption) -> Void) {
您可能从Xcode收到了错误的建议,但是如果将它们设为私有,则不会生成Objective-C入口点. iOS运行时在内部使用Objective-C选择器,因此无法找到您的方法,因此它们不会被执行.