任何人,请告诉我如何在iOS的wkwebview下载文件。我已经创建了一个iOS webview应用程序。在我加载的页面中,它有几个下载选项,但当我单击下载时,什么也没有发生。
注意:我不想创建额外的按钮来下载
发布于 2021-06-17 01:15:39
自从macOS 11.3和iOS 14.5之后,我们终于有了一个应用程序接口来处理下载。但在撰写本文时(2021年6月),文档仍然相当有限:WKDownloadDelegate
1. WKNavigationDelegate
1.1
向您的WKWebView.navigationDelegate添加WKNavigationDelegate
1.2
在您的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)
}
}这将在单击任何链接时被调用。
当WKWebView检测到该链接用于下载文件时,navigationAction.shouldPerformDownload将为真。
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没有将该链接识别为下载,并将尝试显示它。
如果WKWebView意识到它无法显示内容,则navigationResponse.canShowMIMEType将为false。
2. WKDownloadDelegate
2.1
创建WKDownloadDelegate
2.2
在您的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`
}当您对1.一节中描述的任何方法回答.download时,这些方法中的一个将被调用。如果是第一个方法,则调用第一个方法;如果是第二个方法,则调用第二个方法。
您需要为每个下载分配一个代理,但可以为所有下载指定相同的代理。
2.3
在您的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准备好开始下载,但需要目标地址时调用。
2.4
也可以选择在您的WKDownloadDelegate实现中:
func downloadDidFinish(_ download: WKDownload) {
}这将在下载完成时调用。
结束语
WKDownloadDelegate上还有一些方法对处理错误很有用,请查看文档了解更多详细信息(链接提供above).macOS 11.3和iOS 14.5.来发现如何使此工作
https://stackoverflow.com/questions/59083340
复制相似问题