Objective c 如何拦截WKWebView中的下载?

Objective c 如何拦截WKWebView中的下载?,objective-c,macos,cocoa,wkwebview,download,Objective C,Macos,Cocoa,Wkwebview,Download,我正在制作一个Cocoa应用程序,用户可以在线选择图片,以便在应用程序中使用。我还希望从这些下载中收集上下文元数据,例如图像来自的主机、用户访问的网站、响应头中的确切MIME类型等 基本上,我想在互联网上管理我的用户,一边下载图像和元数据到该用户的帐户中。直到今天我还以为这是不可能的 但就在最近,我正在玩一个WKWebView,我试着右键点击一张图片。我看到这个 有什么方法可以连接到“下载图像”按钮,并在其单击时收到通知吗?我确实找到了如何使“下载链接文件”起作用的方法,但这是一个不适合SO回

我正在制作一个Cocoa应用程序,用户可以在线选择图片,以便在应用程序中使用。我还希望从这些下载中收集上下文元数据,例如图像来自的主机、用户访问的网站、响应头中的确切MIME类型等

基本上,我想在互联网上管理我的用户,一边下载图像和元数据到该用户的帐户中。直到今天我还以为这是不可能的

但就在最近,我正在玩一个WKWebView,我试着右键点击一张图片。我看到这个


有什么方法可以连接到“下载图像”按钮,并在其单击时收到通知吗?

我确实找到了如何使“下载链接文件”起作用的方法,但这是一个不适合SO回答的问题:


但是,实现这些私有委托函数似乎不允许“下载图像”以任何方式向我的WkWebView应用发出信号。

通过对WkWebView类进行子类化并实现
willOpenMenu
方法,您可以拦截那些不工作的“下载图像”和“下载链接文件”菜单项,如下所示:

class MyWebView: WKWebView {

    override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) {
        for menuItem in menu.items {
            if  menuItem.identifier == "WKMenuItemIdentifierDownloadImage" ||
                menuItem.identifier == "WKMenuItemIdentifierDownloadLinkedFile" {
                menuItem.action = #selector(menuClick(sender:))
                menuItem.target = self
            }
        }
    }

    func menuClick(sender: AnyObject) {
        if let menuItem = sender as? NSMenuItem {
            Swift.print("Menu \(menuItem.title) clicked")
        }
    }
}
除此之外,您还可以使用
menuItem.ishiden=true

检测所选菜单项是一回事,但了解用户在WKWebView控件中实际单击了什么是下一个挑战:)