UIWebView получить текущий URL веб-сайта SPA (одностраничное приложение) - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу получить текущее местоположение моего UIWebView при просмотре веб-сайта SPA (одностраничное приложение) .
(Да, я намеренно работаю с UIWebView вместо WKWebView.)

Я знаю, что существует несколько подходов для получения текущего URL, например:

webView.request?.url?.absoluteString
webView.request?.mainDocumentURL?.absoluteString
webView.stringByEvaluatingJavaScript(from: "window.location")

Однако,для веб-сайта SPA, для каждого из указанных выше подходов я получаю начальный URL, даже когда перехожу на другую страницу на этом веб-сайте SPA.

Что я могу сделать?

1 Ответ

0 голосов
/ 20 декабря 2018

Шаг 1. Создание настраиваемого URL-протокола для перехвата запросов данных

class CustomURLProtocol: URLProtocol, URLSessionDataDelegate, URLSessionTaskDelegate {

    // If this returns false, the first request will basically stops at where it begins.
    override class func canInit(with request: URLRequest) -> Bool {
        return true
    }

    override class func canonicalRequest(for request: URLRequest) -> URLRequest {
        return request
    }

    override func startLoading() {

        print(self.request.url) // URL of Data requests made by UIWebView before loading.  
        URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil).dataTask(with: self.request).resume()
    }

    override func stopLoading() {

    }

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {

        // Data request responses received.  
        self.client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .allowed)
        completionHandler(.allow)
    }

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {

        // Data request data received.
        self.client?.urlProtocol(self, didLoad: data)
        self.urlSession(session, task: dataTask, didCompleteWithError: nil)
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {

        if let error = error {

            self.client?.urlProtocol(self, didFailWithError: error)
            return
        }

        print(self.request.url) // URL of Data requests completed.
        self.client?.urlProtocolDidFinishLoading(self)
    }
}

Шаг 2. Регистрация настраиваемого URL-протокола

Зарегистрируйте свойпользовательский URLProtocol перед загрузкой вашего SPA в UIWebview.

URLProtocol.registerClass(CustomURLProtocol.self)

Надеюсь, это поможет!Извините за задержку, был пойман на работе.

...