处理iOS Swift中的Javascript文件下载

Rah*_*ana 6 javascript canvas ios swift

我在SO中尝试了很多方法来处理通过javascript传入的下载文件路径.但是我无法获取文件的路径(URL).

在ANDROID中,我们有Android WebKit的DownloadListener方法.通过它我设法获取文件的URL.

我尝试过的:

使用decisionPolicyForNavigationResponsedecisionPolicyForNavigationAction我没有得到任何文件的URL.有关信息,在网站URL中他们使用CANVAS.单击下载按钮后,它们会生成BLOB映像路径以在客户端下载它.

默认情况下,它也可以在iPad中使用GOOGLE CHROME浏览器,但不能与SAFARI浏览器一起使用.

此外,javascript已启用.所以它不会产生问题.

编辑:

出于测试目的,请使用此链接.点击下载按钮,它们会触发一个事件

编辑2

我通过做一些调试来检查网站,他们使用window.opentarget ="_ blank"作为新的图像路径.在window.open之后,他们正在设置window.location.href = popup.document,其中popupwindow.open的一个实例

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

Ste*_*cht 1

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

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

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

在那里可以对图像进行解码和进一步处理。

斯威夫特4:

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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

为了模仿动态 JavaScript 图像创建并使其在标签href的属性中可用a,这里有一个小的服务器端示例:

<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>
Run Code Online (Sandbox Code Playgroud)

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

message: GetDownloadData clicked data:application/octet-stream;base64,iVBORw0...
Run Code Online (Sandbox Code Playgroud)

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

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