首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用iOS Swift处理Javascript文件下载

用iOS Swift处理Javascript文件下载
EN

Stack Overflow用户
提问于 2018-02-27 06:17:27
回答 2查看 4.2K关注 0票数 7

我已经尝试了许多在SO中给出的方法来处理通过javascript下载的文件路径。但是我无法获得文件的路径(URL)。

在安卓系统中,我们采用了安卓DownloadListener WebKit的方法。通过它,我成功地获得了文件的URL。

我尝试过的:

使用decidePolicyForNavigationResponsedecidePolicyForNavigationAction,我不会获得任何文件的url。对于这些信息,他们在网站网址中使用帆布。单击“下载”按钮后,它们会生成一个BLOB图像路径,以便在客户端下载它。

默认情况下,它也可以在iPad中使用GOOGLE浏览器,但与SAFARI浏览器不兼容。

此外,还启用了javascript。因此,这并不是在制造问题。

编辑:

出于测试目的,使用此链接,单击“下载”按钮,就会触发一个事件。

编辑2

我在网站上进行了一些调试,发现他们正在使用target="_blank"window.open作为新的图像路径。在window.open之后,他们正在设置window.location.href = popup.document,其中弹出window.open的一个实例。

在WKWebView中,他们在阻止弹出窗口时禁用了它。但我现在想知道谷歌CHROME是如何管理它的,因为他们也是基于WKWebView的。

EN

Stack Overflow用户

发布于 2018-03-20 19:58:54

在给定的链接中,图像是动态生成的,并且在某种程度上可以作为<a href='data:image/png;base64,iVB...'使用。我们还可以看到,jQuery是在那里使用的。

我还假设下载应该适用于桌面浏览器。

一种解决方案是将JavaScript代码注入应用程序,该应用程序为动态创建的a标记添加单击处理程序,并将href base64编码的图像数据传输到应用程序。

在这里,图像可以被进一步解码和处理。

Swift 4:

代码语言:javascript
运行
复制
class ViewController: UIViewController, WKScriptMessageHandler {

    var webView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()
        webView = WKWebView(frame:  UIScreen.main.bounds, configuration: self.config())
        view.addSubview(webView)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let url = URL(string: httpAddress) {
            webView.load(URLRequest(url: url))
        }
    }

    private func config() -> WKWebViewConfiguration {
        let scriptName = "GetDownloadData"
        let javaScript = "$('body').on('click', 'a.download-anchor', function(e) {"
                    +    "    webkit.messageHandlers.\(scriptName).postMessage('clicked ' + e.target.href); "
                    +    "}); "
        let userScript = WKUserScript(source: javaScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

        let config = WKWebViewConfiguration()
        config.userContentController.addUserScript(userScript)
        config.userContentController.add(self, name: scriptName)
        return config
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("message: \(message.name) \(message.body)")
    }
}

为了模拟动态JavaScript映像创建并使其在a标记的href属性中可用,下面是一个小型服务器端示例:

代码语言:javascript
运行
复制
<html>
<head><title>dynamic download</title>
<head>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

    <button id='download'>download</button>

    <div id='area'></div>    

<script>        
    $("#download").on("click", function(){
        $("#area").append("<a href='data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAYUExURf////8PD//39/8WFv+7u/9SUv9ZWf/Kyvchv38AAAB0SURBVDjLfcrHAcAwDMNAucX7b5zEXTJFfA8iuhqFllOJ3ENgx+/s6O4f071jOz5OR4f2+7Buj9v1gfw8sO/D83n43o9KPIRHJBbiKQs9mpNjuHssd47D4aEcHMav43JzAFcH9ONwfB2uj4N4O6h/x8Md9ALiMQNEcD5b+AAAAABJRU5ErkJggg==' download='Product.png' target='_blank' class='download-anchor' style='display: none;'></a>").find('a')[0].click()
    });

</script>       

</body>
</html>

上面带有此HTML/JavaScript服务器端文件的Swift代码在Xcode的控制台中打印出以下内容:

代码语言:javascript
运行
复制
message: GetDownloadData clicked data:application/octet-stream;base64,iVBORw0...

因此,任务完成了:图像在应用程序端可用。而且,图像仍然可以在桌面浏览器中下载。

我选择的不是data:image/png,而是data:application/octet-stream,因为有些桌面浏览器会尝试在一个单独的浏览器选项卡中显示图像,而不是下载它。

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

https://stackoverflow.com/questions/49002289

复制
相关文章

相似问题

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