【发布时间】:2019-03-25 23:51:32
【问题描述】:
我正在使用 WKWebView 访问一个网站,该网站上有一个下载按钮。在使用下载文件的笔记本电脑的 Chrome 上,当我在 iOS 模拟器上单击下载时,它会在 WKWebView 中显示图像。我的目标是保存该图像并稍后在 CollectionView 中显示它。如果我的 URL 为 https://www.website.com/image.jpg,那么这很容易做到,问题是它是一个 blob url,所以格式为 blob:https://www.website.com/abcd-efgh-ijkl。
我发现这个链接有点帮助: How to read a blob data URL in WKWebView?
这是我的 ViewController 的精简版:
import UIKit
import WebKit
class DownloadBlob: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {
lazy var webView: WKWebView = {
let config = WKWebViewConfiguration()
config.userContentController.add(self, name: "readBlob")
let webView = WKWebView(frame: UIScreen.main.bounds, configuration: config)
webView.navigationDelegate = self
return webView
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let request = URLRequest(url: url!)
webView.load(request)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Finished")
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
print(navigationResponse)
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
print(navigationAction)
let navigationURL = navigationAction.request.url
if (navigationURL?.absoluteString.contains("blob"))! {
testDownloadBlob(navigationURL: navigationURL!)
}
decisionHandler(.allow)
}
func testDownloadBlob(navigationURL: URL) {
var script = ""
script = script + "var xhr = new XMLHttpRequest();"
script = script + "xhr.open('GET', '\(navigationURL.absoluteString)', true);"
script = script + "xhr.responseType = 'blob';"
script = script + "window.webkit.messageHandlers.readBlob.postMessage('making sure script called');"
script = script + "xhr.onload = function(e) { if (this.status == 200) { var blob = this.response; window.webkit.messageHandlers.readBlob.postMessage(blob); var reader = new window.FileReader(); reader.readAsBinaryString(blob); reader.onloadend = function() { window.webkit.messageHandlers.readBlob.postMessage(reader.result); }}};"
script = script + "xhr.send();"
self.webView.evaluateJavaScript(script) { (results, error) in
print(results ?? "")
}
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.name, message.body)
}
}
我注意到 xhr.onload 根本没有被调用,但不知道如何解决这个问题。但是,我确实收到了与 decisionPolicyFor navigationResponse 中的 blob 相关的响应。
有没有办法获取图像数据并保存?
【问题讨论】:
-
您找到解决方法了吗?
-
找到解决方案了吗?
标签: javascript ios swift uiwebview wkwebview