如何处理iOS 10中的UserNotifications动作



所以我可以像这样安排通知;

//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, *)
private func userNotificationCenter(_ center: UNUserNotificationCenter, 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中也都没有调用。我不确定更新扩展视图的问题是否与应用程序委托有关。我不这么认为,我看了苹果的WWDC视频和其他教程,看了文档API,还是不明白;

  • 为什么通知扩展文本标签不更新
  • 为什么appDelegate中的函数没有被调用?
  • 我如何在app委托中使用通知内容来使用
PS:我花了过去几周的时间研究并试图弄清楚这一点,它似乎相当直接,我不确定我错过了什么。我知道我不是唯一一个有这些问题的人。

我没有检查你的整个代码,但至少,这些函数头需要更改如下:

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {
func didReceive(_ response: UNNotificationResponse,
                completionHandler done: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {

简单的规则:删除private,添加@escaping

你可能收到了来自Xcode的错误建议,但将它们设置为private,就不会生成Objective-C入口点。iOS运行时在内部使用Objective-C选择器,所以它找不到你的方法,因此,它们不会被执行。

最新更新