我已经尝试了许多在SO中给出的方法来处理通过javascript下载的文件路径。但是我无法获得文件的路径(URL)。
在安卓系统中,我们采用了安卓DownloadListener WebKit的方法。通过它,我成功地获得了文件的URL。
我尝试过的:
使用decidePolicyForNavigationResponse和decidePolicyForNavigationAction,我不会获得任何文件的url。对于这些信息,他们在网站网址中使用帆布。单击“下载”按钮后,它们会生成一个BLOB图像路径,以便在客户端下载它。
默认情况下,它也可以在iPad中使用GOOGLE浏览器,但与SAFARI浏览器不兼容。
此外,还启用了javascript。因此,这并不是在制造问题。
编辑:
出于测试目的,使用此链接,单击“下载”按钮,就会触发一个事件。
编辑2
我在网站上进行了一些调试,发现他们正在使用target="_blank"的window.open作为新的图像路径。在window.open之后,他们正在设置window.location.href = popup.document,其中弹出是window.open的一个实例。
在WKWebView中,他们在阻止弹出窗口时禁用了它。但我现在想知道谷歌CHROME是如何管理它的,因为他们也是基于WKWebView的。
发布于 2018-03-20 19:58:54
在给定的链接中,图像是动态生成的,并且在某种程度上可以作为<a href='data:image/png;base64,iVB...'使用。我们还可以看到,jQuery是在那里使用的。
我还假设下载应该适用于桌面浏览器。
一种解决方案是将JavaScript代码注入应用程序,该应用程序为动态创建的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映像创建并使其在a标记的href属性中可用,下面是一个小型服务器端示例:
<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,因为有些桌面浏览器会尝试在一个单独的浏览器选项卡中显示图像,而不是下载它。
https://stackoverflow.com/questions/49002289
复制相似问题