首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在wkwebview中下载文件

如何在wkwebview中下载文件
EN

Stack Overflow用户
提问于 2019-11-28 15:04:00
回答 3查看 14.4K关注 0票数 5

任何人,请告诉我如何在iOS的wkwebview下载文件。我已经创建了一个iOS webview应用程序。在我加载的页面中,它有几个下载选项,但当我单击下载时,什么也没有发生。

注意:我不想创建额外的按钮来下载

EN

Stack Overflow用户

发布于 2021-06-17 01:15:39

自从macOS 11.3iOS 14.5之后,我们终于有了一个应用程序接口来处理下载。但在撰写本文时(2021年6月),文档仍然相当有限:WKDownloadDelegate

1. WKNavigationDelegate

1.1

向您的WKWebView.navigationDelegate添加WKNavigationDelegate

1.2

在您的WKNavigationDelegate实现上:

代码语言:javascript
复制
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实现上也是如此:

代码语言:javascript
复制
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实现中:

代码语言:javascript
复制
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实现中:

代码语言:javascript
复制
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实现中:

代码语言:javascript
复制
func downloadDidFinish(_ download: WKDownload) {
        
}

这将在下载完成时调用。

结束语

  • 记住,这两个委托都不会被WKWebView保留,所以你需要保留它们,WKDownloadDelegate上还有一些方法对处理错误很有用,请查看文档了解更多详细信息(链接提供above).
  • Important以记住这只在前面提到的macOS 11.3iOS 14.5.
  • As上受支持,文档仍然稀缺,我只是通过尝试错误,任何反馈appreciated.

来发现如何使此工作

票数 4
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59083340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档