我已经尝试了 SO 中提供的许多方法来处理通过 javascript 的下载文件路径。但是我无法获取文件的路径(URL)。
在 ANDROID 中我们有 DownloadListener Android WebKit 的方法。通过它我设法获得了文件的 URL。
我尝试过的:
使用 decidePolicyForNavigationResponse 和 decidePolicyForNavigationAction 我没有得到文件的任何 url。 有关信息,他们在网站 URL 中使用 CANVAS .点击下载按钮后,生成BLOB图片路径,在客户端下载。
默认情况下,它也可以在 iPad 中使用 GOOGLE CHROME 浏览器,但不能使用 SAFARI 浏览器。
此外,javascript 已启用。所以这不会造成问题。
编辑:
出于测试目的,请使用此 link , 点击下载按钮,触发事件
编辑 2
我在网站上进行了一些调试,检查他们正在使用 window.open 和 target="_blank" 作为新的图像路径。在 window.open 他们设置 window.location.href = popup.document 其中 popup 是 window.open
在 WKWebView 中,他们在阻止弹出窗口时禁用了它。但我现在想知道 GOOGLE CHROME 是如何管理它的,因为它们也在基于 WKWebView 上。
最佳答案
在您给定的链接中,图像是动态生成的,并且在某些时候可以作为 <a href='data:image/png;base64,iVB...'
使用。 .还可以看到,那里使用了 jQuery。
我还假设下载应该适用于桌面浏览器。
一种解决方案是将 JavaScript 代码注入(inject)您的应用程序,为动态创建的 a
添加点击处理程序。标记并传输 href
base64 编码的图像数据到应用程序。
可以对图像进行解码和进一步处理。
swift 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)")
}
}
模仿动态 JavaScript 图像创建并使其在 href
中可用a
的属性(property)标记,这里是一个小的服务器端示例:
<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 的控制台中打印出以下内容:
message: GetDownloadData clicked data:application/octet-stream;base64,iVBORw0...
任务完成:图像在应用程序端可用。此外,该图像仍然可以在桌面浏览器中下载。
而不是 data:image/png
我选择了data:application/octet-stream
因为某些桌面浏览器否则会尝试在单独的浏览器选项卡中显示图像而不是下载图像。
关于javascript - 在 iOS Swift 中处理 Javascript 文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49002289/