Я захожу на сайт с помощью WKWebView, и на этом сайте есть кнопка загрузки.На Chrome с помощью ноутбука, который загружает файл, когда я нажимаю «загрузить» на симуляторе iOS, он отображает изображение в WKWebView.Моя цель - сохранить это изображение и отобразить его в CollectionView позже.Если бы у меня был URL-адрес https://www.website.com/image.jpg
, это было бы легко сделать, проблема в том, что это URL-адрес большого двоичного объекта, поэтому в формате blob:https://www.website.com/abcd-efgh-ijkl
.
я нашел эту ссылку, которая несколько полезна: Как прочитать URL-адрес данных большого двоичного объекта в 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 не вызываетсяна всех, но не уверен, как это исправить.Однако я получаю ответ с помощью BLOB-объекта в definePolicyFor navigationResponse.
Есть ли способ сделать это, чтобы получить данные изображения и сохранить их?