如何在wkwebview中下载文件

2023-11-26

有人请告诉我如何在 iOS wkwebview 中下载文件。我创建了一个 iOS 网络视图应用程序。在我加载的页面中,它有几个下载选项,但是当我单击下载时没有任何反应。

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


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.
  • 如前所述,文档仍然稀缺,我只是通过尝试错误找到了如何使其工作,任何反馈表示赞赏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在wkwebview中下载文件 的相关文章

随机推荐

  • DRF 中的动作装饰器不适用于 url_path

    我正在努力实现这样的终点 api messages
  • 为什么我不能使用urlencode编码json格式数据?

    我有一个关于 python 2 7 中的 urlencode 的问题 gt gt gt import urllib gt gt gt import json gt gt gt urllib urlencode json dumps titl
  • 实现 47 度 android-swipelistview 用于滑动 android ListViewItem

    实际上我的目标是在android中实现ListViewItem Swipe 我已经尝试过了 stackoverflow 有几个可以让你的 ListViewSwipe 的例子 例子 简单的滑动手势活动教程 从列表视图中滑动一项时在列表视图中显
  • 将程序加载到 RAM 并执行它们 NASM 16b

    我迫切需要解决这个问题 我正在尝试开发汇编代码 允许我加载和执行 通过用户的输入 2 个其他 Assembly EXE 程序 我有两个问题 我似乎无法将路径名分配给有效的寄存器 或者可能是错误的语法 我需要能够在第一个程序 可能是 开始执行
  • Python 对象删除自身

    为什么这不起作用 我正在尝试使类的实例删除自身 gt gt gt class A def kill self del self gt gt gt a A gt gt gt a kill gt gt gt a lt main A instan
  • SPA 中刷新令牌 Cookie 的 CSRF 保护

    我在 AngularJS SPA 中使用资源所有者密码凭据 OAuth 2 0 流程 有几篇文章 here here 以及答案这个问题这说明我们不应该将刷新令牌存储在 Web 客户端 LocalStorage 上 而是将它们加密存储在 Ht
  • 使用 android.telecom 和 InCallService 接听来电

    自 API 21 以来 Google 一直在添加功能android 电信总体而言 特别是通过实施更多成员电信经理并添加通话服务 最后一个应该允许非系统 第三方应用程序提供和替换系统呼叫应用程序通话中屏幕的功能 弹出并允许执行操作的窗口EXT
  • Asm代码解释

    以下 GCC 内联汇编取自 LuaJit 的 coco 库 有人可以逐行解释它的作用吗 static inline void coco switch coco ctx from coco ctx to asm volatile movl 1
  • tesseract 安装 mac 操作系统

    我正在尝试使用 homeBrew 在我的 mac 上安装 tesseract 当我尝试安装时 一切似乎都很好 但我收到以下错误 消息 Warning Could not link leptonica Unlinking Error The
  • shell脚本测试

    我正在尝试更新其他人编写的 bash 脚本 但遇到了一行我不确定的内容 谁能告诉我以下检查的作用 if RESULT 0 0 我假设它正在检查 RESULT 中的某些值 可能带有子字符串 任何帮助表示赞赏 命令 只是命令的别名test 右方
  • CORS 适用于对 API 的直接请求,但不适用于静态文件(如 css)

    我们正在开发一个由 Android 组成的项目Mobile App连同一个Web API Web API 是 Asp net MVC Core 我已经启用了CORS服务于我的Startup cs 因此移动应用程序 API 调用可以跨源访问
  • 迭代 std::deque 时擦除元素时出现分段错误

    为什么下面的代码会崩溃 当我通过反向迭代器进行迭代时应该做什么 那么如何删除单个元素呢 deque q q push back 4 q push back 41 q push back 14 for auto it q begin it q
  • pandas - 两列的直方图?

    我有这个数据 data pd DataFrame from dict r for r in response print data id total 0 213 1 1 194 3 2 205 156 现在 如果我打电话 data hist
  • 带有闪亮工具提示BS的反应式单选按钮

    我想创建一个radioButtons带有工具提示的小部件使用shinyBS 我想要实现的是创建一个带有 3 个按钮的小部件 其中包含不同的信息tooltip 基于此solution它创建了 3 个具有不同 id 值的独立单选按钮 是否可以做
  • intptr_t 是 uintptr_t 的有符号对应项(反之亦然)吗?

    我正在为 add signed MPL 类开发一些测试 将类型转换为其签名的对应项 它的定义如下 template
  • 在python中将url保存为文件名

    我有一个网址 例如 http example com here there index html 现在我想将文件及其内容保存在目录中 我希望文件名是 http example com here there index html 但我收到错误
  • 检测字符串是否为数字的最优雅的方法?

    有没有比这更好 更优雅 和 或可能更快 的方法 boolean isNumber false try Double valueOf myNumber isNumber true catch NumberFormatException e E
  • 是否可以将类内类的实例设置为 null

    是否可以将类内类的实例设置为 null 例如 我可以做这样的事情吗 int main Create a new test object Test test new Test Delete that object This method sh
  • Grit的clone方法未定义?

    我最近开始从事一个使用 git 进行存储并使用 ruby 作为前端的项目 我的脚本的第一个版本使用 ruby git 虽然非常简单 但还可以 当我需要对我的提交和日志进行更具体的工作时 建议我转向坚毅 然而 我在早期遇到了一个障碍 grit
  • 如何在wkwebview中下载文件

    有人请告诉我如何在 iOS wkwebview 中下载文件 我创建了一个 iOS 网络视图应用程序 在我加载的页面中 它有几个下载选项 但是当我单击下载时没有任何反应 注意 我不想创建额外的下载按钮 Since macOS 11 3 and