在 WKWebView 上禁用 link 拖动

Disable link drag on WKWebView

我使用的是 Xcode 和 Swift 的最新版本。我正在使用以编程方式创建的 WKWebView。

如果我点击 link,稍等一下,然后移动我的手指,我可以拖动(然后放下)一个带有 link 标题和 link本身。

澄清一下:我不是指强制触摸,它会显示 link 预览和一些操作,例如 Ad link to reading list

如何禁用拖动 link 行为?

我在这里找到了解决方案:

这是我的工作代码:

private func disableDragAndDropInteraction() {
    var webScrollView: UIView? = nil
    var contentView: UIView? = nil
    
    if #available(iOS 11.0, *) {
        guard let noDragWebView = webView else { return }
        webScrollView = noDragWebView.subviews.compactMap { [=10=] as? UIScrollView }.first
        contentView = webScrollView?.subviews.first(where: { [=10=].interactions.count > 1 })
        guard let dragInteraction = (contentView?.interactions.compactMap { [=10=] as? UIDragInteraction }.first) else { return }
        contentView?.removeInteraction(dragInteraction)
    }
}
override func viewDidAppear(_ animated: Bool) {
    disableDragAndDropInteraction()
}

您还必须在初始化 WKWebView 后添加 disableDragAndDropInteraction(),例如在 viewDidLoad().

如果你控制了 HTML 加载到 WKWebView,你可以使用 CSS 属性 webkit-touch-callout 像:

img, a {
    -webkit-touch-callout: none;
}

您还需要将元素的 draggable 属性设置为 false,例如:

<img ... draggable="false">

我想您也可以使用 -[WKWebView evaluateJavaScript(...)] 和 family 来注入这些修改。

这将避免依赖脆弱的子视图潜水和操作。

从 iOS 15.3 开始测试。

这是一些官方(旧)文档:https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html#//apple_ref/doc/uid/TP30001266-_webkit_touch_callout