如何删除 UNNotificationContentExtension 显示的视图

How to remove UNNotificationContentExtension displayed view

我使用 UNNotificationContentExtension 进行了用户调查。

条件是我没有打开父应用

这是表情符号动作

    if #available(iOSApplicationExtension 12.0, *) {

        // API call here
        self.extensionContext?.dismissNotificationContentExtension()
    } else {
        // Fallback on earlier versions
    }

每个表情符号都有动作。当用户点击表情符号时,我会将响应发送到服务器并删除此通知。一切都会发生在扩展部分

有什么问题?

使用dismissNotificationContentExtension 通知关闭和隐藏即时。它再次出现在通知屏幕中。当用户点击表情符号按钮时,如何删除此通知。

您可以使用 UNUserNotificationCenter 和 UNNotificationContentExtension 协议来做到这一点

使用 UNUserNotificationCenter 添加操作

let center = UNUserNotificationCenter.current()
center.delegate = self  
center.requestAuthorization (options: [.alert, .sound]) {(_, _) in 
}  
let clearAction = UNNotificationAction(identifier: "sadEmoji", title: "Emoji", options: [])
let category = UNNotificationCategory(identifier: "NotifCategory", actions: [clearAction], intentIdentifiers: [], options: [])
 center.setNotificationCategories([category])

在您的扩展的视图控制器中添加协议 UNNotificationContentExtension 的委托方法

 func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
    if response.actionIdentifier == "sadEmoji" {
        UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: "NotifCategory")
    }
    completion(.dismiss)
}

尝试一下,让我知道它有效。

这就是我的解决方案的工作原理。 缺点:删除所有已发送的相同类别的通知,而不是删除当前消息。

@IBAction func btnActionHappy(_ sender: Any) {
    
       UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
            if #available(iOSApplicationExtension 12.0, *) {
                self.extensionContext?.dismissNotificationContentExtension()
            } else {
                // Fallback on earlier versions
            }

            let matchingNotifications = notifications.filter({ [=10=].request.content.categoryIdentifier == "debitOverdraftNotification" })
            UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: matchingNotifications.map({ [=10=].request.identifier }))
            
            print("Somethings")

        }
}

您可以使用removeDeliveredNotifications(withIdentifiers:)删除当前通知。

var notification: UNNotification?

func didReceive(_ notification: UNNotification) {
    self.notification = notification

    ...
}

@IBAction func btnActionHappy(_ sender: Any) {
    if #available(iOSApplicationExtension 12.0, *) {
        extensionContext?.dismissNotificationContentExtension()
    }

    if let identifier = notification?.request.identifier {
        let center = UNUserNotificationCenter.current()
        center.removeDeliveredNotifications(withIdentifiers: [identifier])
    }
}