Загрузите изображение из блоба WKWebView, не зная URL - PullRequest
0 голосов
/ 22 октября 2018

Я захожу на сайт с помощью 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.

Есть ли способ сделать это, чтобы получить данные изображения и сохранить их?

...