如何检测“清除”通知

时间:2018-01-10 16:14:09

标签: ios swift apple-push-notifications

如果从用户通知到达通知中心的时间超过一分钟,就会有一个“清除”选项,可以立即从通知中心解除一个或多个通知。

iOS操作系统如何通知用户点击“清除”以同时关闭多个通知?

3 个答案:

答案 0 :(得分:2)

可以从iOS 10及更高版本实现自定义通知,您需要使用UNNotificaitons

private func registerForRemoteNotificaiton(_ application: UIApplication) {
    // show the dialog at a more appropriate time move this registration accordingly.
    // [START register_for_notifications]
    if #available(iOS 10.0, *) {
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {(granted, error) in
                if granted {
                    DispatchQueue.main.async(execute: {
                        UIApplication.shared.registerForRemoteNotifications()
                    })
                }
        })
        configureUserNotification()
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self
        // For iOS 10 data message (sent via FCM)
        Messaging.messaging().delegate = self as MessagingDelegate
    } else {
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }
    // [END register_for_notifications]
}

private func configureUserNotification() {
    if #available(iOS 10.0, *) {
        let action = UNNotificationAction(identifier: UNNotificationDismissActionIdentifier, title: "Cancel", options: [])
        //let action1 = UNNotificationAction(identifier: "dismiss", title: "OK", options: [])
        let category = UNNotificationCategory(identifier: "myNotificationCategory", actions: [action], intentIdentifiers: [], options: .customDismissAction)
        UNUserNotificationCenter.current().setNotificationCategories([category])
    } else {
        // Fallback on earlier versions
    }

}

从appdelegate的didFinishLaunching方法调用registerForRemoteNotificaiton方法。

然后你需要在appdelegate中实现UNUserNotificationCenterDelegate。

然后你会得到明确的(这里是我们在动作名称中添加的“Dismiss”)

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {

    if response.actionIdentifier == UNNotificationDismissActionIdentifier {
        //user dismissed the notifcaiton:

    }

    completionHandler()
}

查找更多信息here

答案 1 :(得分:0)

范的答案直接朝着正确的方向发展,但我们无需实施自定义操作即可获得问题提供者想要的东西。

如果创建类别并将其传递给UNUserNotificationCenter,则即使用户在内容扩展名上的内置“清除”按钮或“ X”按钮上进行制表,您也会在委托didReceive函数上获得回调。然后,ResponeIdentifier将为response.actionIdentifier == UNNotificationDismissActionIdentifier

类别必须是这样的:

//Create the category...
UNNotificationCategory(identifier: "YourCustomIdentifier",
actions: [], intentIdentifiers: [], options: .customDismissAction)

//... and pass it to the UNUserNotificationCenter
UNUserNotificationCenter.current().setNotificationCategories(notificationCategories)

该类别触发了iOS框架中的魔力,突然您在委托中得到回调。 委托函数应类似于:

func userNotificationCenter(_ center: UNUserNotificationCenter,
                        didReceive response: UNNotificationResponse,
                        withCompletionHandler completionHandler: @escaping () -> Void) {
  if response.actionIdentifier == UNNotificationDismissActionIdentifier {
    // notification has been dismissed somehow        
  }
  completionHandler()
}

答案 2 :(得分:-1)

首先,您应该设置UNUserNotificationCenterDelegate:

import UserNotifications

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().delegate = self
    return true
}

然后为用户委派functinos

extension AppDelegate: UNUserNotificationCenterDelegate {
  func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    switch response.actionIdentifier {
    case UNNotificationDismissActionIdentifier:
      // Do whatever you want to do on dismiss action, when user clear the notification
      break

    case UNNotificationDefaultActionIdentifier:
            // Do whatever you want to do on tap action, when user tap on notification and your application will open
      break

    default:
      break
    }
  }
}