如何通过自定义操作解除3D触摸通知?

时间:2017-06-27 13:24:41

标签: ios objective-c iphone notifications 3dtouch

我正在使用UserNotifications为我的应用实施一种提醒通知。当3D触摸此通知时,我希望它显示一些警报信息'以及选项" Snooze"警报,将在5分钟内有效地重复通知。 这一切都运行正常,但单击“暂停”按钮时通知不会被解除。

我使用NotificationContentExtension修改内容,使用categoryIdentifier "ReminderNotificationExtensionCategory"。然后我用这样的代码创建了我的类别:

let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
let reminderCategory = UNNotificationCategory(identifier: "ReminderNotificationExtensionCategory", actions: [snooze], intentIdentifiers: [], options: .customDismissAction)

UNUserNotificationCenter.current().setNotificationCategories([reminderCategory])//Not sure if I should set this every time or just once..

然后我创建了我的通知对象

let content = UNMutableNotificationContent()        
content.categoryIdentifier = "ReminderNotificationExtensionCategory"
content.title = "test"
content.body = "test"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) //Fire in 3 seconds
let request = UNNotificationRequest(identifier: "someIdentifier, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error:Error?) in /**/}

现在,我的通知将在3秒后发送。 我锁定屏幕并接收它,它看起来很棒。当我3D触摸它时,我的扩展程序启动了,我在UIView设置了一个潜行峰值,以及我在通知下面的" Snooze" - 按钮,如图所示图片:(已删除内容)Notification

当我点击" Snooze" - 按钮时,将调用UNNotificationContentExtension委托方法,具体为func didReceive(_ response: completion:) 完成时只接受UNNotificationContentExtensionResponseOption的值,该值可以是.dismiss.doNotDismiss.dismissAndForwardAction。 仅仅为了测试,我已经这样做了:

func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
    print("This is happening. ActionIdentifier: ", response.actionIdentifier)
    completion(.dismiss)
}

当我调试通知扩展时,打印确实发生了。它打印出"This is happening. ActionIdentifier: snoozeActionIdentifier"。但是,通知没有被驳回。 如果我从.dismiss更改为.doNotDismiss,则不会发生任何变化。它仍然没有消失。如果我更改为.dismissAndForwardAction,则会解散并打开我的应用。

我找不到有这个问题的人。我希望.dismiss拒绝我的通知。为什么不呢?我做错了吗?

修改 我现在看到这两种情况正在发生:

  1. 我在锁定屏幕上触摸我的通知,然后点按其外部,我的通知“崩溃”#39;并且在3D触摸之前可以看到常规通知。

  2. 我在锁定屏幕上触摸我的通知,点按“暂停”按钮' (并且没有任何反应),然后点按通知外部,常规通知消失。

  3. 因此,完成回调实际上会解除常规通知,但不会解除扩展。为什么?我如何解雇延期?这是我必须打电话的手动方法吗?

1 个答案:

答案 0 :(得分:7)

我现在看到了我的愚蠢错误..

正如您在上面的代码中所看到的,我已经在我的类别中实例化了操作按钮:

let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)

最后,我指定选项.foreground。为了我的目的,这应该只是一个空数组[]

我认为我必须指定 选项,并且输入类型为UNNotificationActionOptions,其中只有选项.authenticationRequired("不,我不喜欢& #39; t想要").destructive("不,我不想要一个红色按钮")和.foreground("好吧,如果我必须选择一个,如果这些..")。事实证明,只需指定一个空数组[]即可。