【发布时间】:2020-04-02 20:29:15
【问题描述】:
在我开始之前,应该注意我的问题的 部分 是 this 帖子的副本,该帖子没有可接受的答案。此外,我还阅读了其他几篇与我的问题相似但不准确的 SO 帖子,例如 this 和 this。
问题:
我使用 WKWebView 来显示用 HTML 标记的文本。一些文本包含链接,我希望在点击时在 Safari 中打开这些链接。我已经走了很远,但我仍然遇到 2 个主要问题。
1) WKWebView 不响应会话的第一次点击,即,必须点击第一个链接两次才能打开 Safari。之后点击任何链接都会立即打开 Safari。
2) Safari 仅打开被点击的第一个链接的 URL。假设正在显示 3 个 URL:A、B 和 C。如果首先点击 A,那么只要初始化 WKWebView,点击其他 2 个 URL 中的任何一个都将始终打开 Safari 到 A。如果先点击B,Safari只会对B等开放。
这是我认为与这个问题最相关的 Swift 代码:
class CustomWebView: WKWebView, WKUIDelegate, WKNavigationDelegate {
convenience init() {
let config = WKWebViewConfiguration()
config.dataDetectorTypes = [.all]
self.init(frame: .zero, configuration: config)
navigationDelegate = self
uiDelegate = self
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (_: WKNavigationResponsePolicy) -> Void) {
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (_: WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url {
print("url: \(url)")
let paths = url.absoluteString.components(separatedBy: ",")
print("paths: \(paths)")
for path in paths {
if path.contains("link:") {
let link = path.replacingOccurrences(of: "link:", with: "").replacingOccurrences(of: "%22", with: "")
print("link: \(link)")
if let cleanedURL = URL(string: link) {
print("cleanedURL: \(cleanedURL)")
UIApplication.shared.open(cleanedURL, options: [:], completionHandler: nil)
decisionHandler(.cancel)
return
}
}
}
}
decisionHandler(.allow)
}
}
这是我正在测试的一些示例 HTML:
<a href="https://www.bbc.com/">https://www.bbc.com/</a>
<div>
<br />
</div>
<div><a href="https://www.youtube.com/">https://www.youtube.com/</a>
<br />
</div>
<div>
<br />
</div>
<div><a href="https://stackoverflow.com/">https://stackoverflow.com/</a>
<br />
</div>
以下是打印语句显示的内容:
第 1 步
点击链接A:
网址:callback://0/underline,justifyLeft,textColor
路径:["callback://0/underline", "justifyLeft", "textColor"]
第 2 步
再次点击链接 A:
网址:callback://0/underline,justifyLeft,textColor,link:https://www.bbc.com/
路径:["callback://0/underline", "justifyLeft", "textColor", "link:https://www.bbc.com/"]
链接:https://www.bbc.com/
cleanedURL:https://www.bbc.com/
第 3 步
在执行第 2 步后点击链接 A、B 或 C 会得到与第 2 步相同的打印语句。
其他说明:
HTML 来自ZSSRichTextEditor,它在应用程序的另一部分实现,让用户输入标记的 HTML。有时,当用户输入链接时,编辑器吐出的 HTML 会将其包围在 %22 中,这就是我在上面的代码中将其删除的原因。
【问题讨论】:
标签: ios swift safari wkwebview rich-text-editor