Since macOS 11.3
and iOS 14.5
我们终于有了一个 API 来处理下载。
但在撰写本文时(2021 年 6 月),文档仍然相当有限:WK下载代理
1.WKNavigationDelegate
1.1
Add a WKNavigationDelegate
给你的WKWebView.navigationDelegate
1.2
On your WKNavigationDelegate
实施:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {
if navigationAction.shouldPerformDownload {
decisionHandler(.download, preferences)
} else {
decisionHandler(.allow, preferences)
}
}
单击任何链接时都会调用此函数。
navigationAction.shouldPerformDownload
当 WKWebView 检测到该链接用于下载文件时,该值为 true。
1.3
也在你的WKNavigationDelegate
实施:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
if navigationResponse.canShowMIMEType {
decisionHandler(.allow)
} else {
decisionHandler(.download)
}
}
如果您回答了,就会调用此方法decisionHandler(.allow, preferences)
在第一种方法上,这意味着 WKWebView 无法将该链接识别为下载,并将尝试显示它。
navigationResponse.canShowMIMEType
如果 WKWebView 意识到它无法显示内容,则为 false。
2.WKDownloadDelegate
2.1
创建一个WKDownloadDelegate
2.2
In your WKWebView
实施:
func webView(_ webView: WKWebView, navigationAction: WKNavigationAction, didBecome download: WKDownload) {
download.delegate = // your `WKDownloadDelegate`
}
func webView(_ webView: WKWebView, navigationResponse: WKNavigationResponse, didBecome download: WKDownload) {
download.delegate = // your `WKDownloadDelegate`
}
当您回答时将调用这些方法之一.download
节中描述的任何方法1.
。如果是第一个方法,则将调用第一个;如果是第二个方法,则将调用第二个。
您需要为每次下载分配一个委托,但所有下载都可以是同一个委托。
2.3
In your WKDownloadDelegate
实施:
func download(_ download: WKDownload, decideDestinationUsing response: URLResponse, suggestedFilename: String, completionHandler: @escaping (URL?) -> Void) {
let url = // the URL where you want to save the file, optionally appending `suggestedFileName`
completionHandler(url)
}
当 WKWebView 准备开始下载但需要目标 URL 时,将调用此函数。
2.4
或者,也可以在您的WKDownloadDelegate
实施:
func downloadDidFinish(_ download: WKDownload) {
}
下载完成后将调用此函数。
最后的笔记
- 请记住,WKWebView 不会保留这两个委托,因此您需要自己保留它们。
- 还有一些方法可以参考
WKDownloadDelegate
对于处理错误很有用,请查看文档以获取更多详细信息(上面提供的链接)。
- 重要的是要记住这仅支持
macOS 11.3
and iOS 14.5
.
- 如前所述,文档仍然稀缺,我只是通过尝试错误找到了如何使其工作,任何反馈表示赞赏。