Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用自定义操作取消3D触摸通知?_Ios_Objective C_Iphone_Notifications_3dtouch - Fatal编程技术网

Ios 如何使用自定义操作取消3D触摸通知?

Ios 如何使用自定义操作取消3D触摸通知?,ios,objective-c,iphone,notifications,3dtouch,Ios,Objective C,Iphone,Notifications,3dtouch,我正在使用UserNotifications为我的应用程序实现一种警报通知。当3D触摸此通知时,我希望它显示一些“警报信息”,以及“暂停”警报的选项,这将在5分钟内有效地重复通知。 这一切都很好,只是当我点击“打盹”按钮时,通知没有被取消 我正在使用NotificationContentExtension修改内容,类别标识符为“提醒通知extensioncategory”。然后,我在如下代码中创建了我的类别: let snooze = UNNotificationAction(identifie

我正在使用
UserNotifications
为我的应用程序实现一种警报通知。当3D触摸此通知时,我希望它显示一些“警报信息”,以及“暂停”警报的选项,这将在5分钟内有效地重复通知。 这一切都很好,只是当我点击“打盹”按钮时,通知没有被取消

我正在使用
NotificationContentExtension
修改内容,类别标识符
为“提醒通知extensioncategory”
。然后,我在如下代码中创建了我的类别:

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”-按钮,如图所示:(内容已删除)

当我单击“Snooze”按钮时,将调用一个
UNNotificationContentExtension
delegate方法,特别是
func-didReceive(uu-response:completion:)
完成仅接受值
UNNotificationContentExtensionResponseOption
,该值可以是
.dismise
.donotdismise
、或
.dismissAndForwardAction
。 为了测试,我做了以下工作:

func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
    print("This is happening. ActionIdentifier: ", response.actionIdentifier)
    completion(.dismiss)
}
当我调试通知扩展时,打印确实发生了。它打印出
“这正在发生。操作标识符:snoozeActionIdentifier”
。然而,该通知并未被驳回。 如果我从
.disease
更改为
.donotdisease
,则不会发生任何更改。它仍然没有驳回。如果我更改为
.dismissAndForwardAction
,它将关闭并打开我的应用程序

我找不到有这个问题的人。我想要
.discome
来取消我的通知。为什么不是呢?我做错什么了吗

编辑 我现在看到这两种情况正在发生:

  • 我在锁屏上用3D触摸我的通知,然后点击它的外部,我的通知“折叠”,常规通知就像我用3D触摸它之前一样可见

  • 我在锁屏上用3D触摸我的通知,点击“打盹”(什么也不发生),然后点击通知外,常规通知消失


  • 因此,完成回调实际上会关闭常规通知,但不会关闭扩展。为什么?我怎样才能取消分机?这是我必须调用的手动方法吗?

    我现在明白我的愚蠢错误了

    正如您在上面的代码中所看到的,我已将我的类别中的action按钮实例化为:

    let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
    
    在最后,我指定了选项
    .foreground
    。就我而言,这应该是一个空数组
    []


    我想我必须指定一个选项,输入类型是
    无提示操作选项
    ,它只有选项
    。authenticationRequired
    (“不,我不想那样”)
    。破坏性的
    (“不,我不想要红色按钮”)和
    。前台
    (“如果我必须选择一个,如果这些..”)。事实证明,只需指定一个空数组就可以了。

    我对您的问题感到困惑。你的意思是当你按下snooze时…它打开了应用程序,但是snooze通知仍然在你的屏幕上?@Honey如果我用
    调用完成处理程序。dismissAndForwardAction
    它打开了我的应用程序。如果我使用
    .discouse
    调用完成处理程序,则根本不会发生任何事情(例如,它既没有关闭也没有打开应用程序)。结果发现问题出在我初始化通知动作的时候。显然,
    UNNotificationActionOptions
    描述了按钮的作用,而
    UNNotificationContentExtensionResponseOption
    描述了操作发生后通知应该做什么。原来通知的
    .discouse
    与按钮的
    .foreground
    不匹配。谢谢!一点也不愚蠢,我也这么想。这应该是可选的,或者有更好的文档。再次感谢!除此之外,您还可以为选项
    UNNotificationAction(标识符:typeIdentifier,title:title)