WKWebView не обнаруживает URL отличается - PullRequest
0 голосов
/ 02 мая 2019

У меня есть 3 URL, которые я открываю в своем приложении, используя WKWebView.

Эти URL-адреса используются для запуска единого входа в другой продукт с использованием файла cookie, установленного моим приложением при входе в систему.

Они выглядят следующим образом

магазин

https://identity.domain.io/auth/some/params/protocol/saml/clients/sso?RelayState=shop_page

Профиль

https://identity.domain.io/auth/some/params/protocol/saml/clients/sso?RelayState=profile_page

дом

https://identity.domain.io/auth/some/params/protocol/saml/clients/sso

Когда я открываю любые вкладки, представление загружается правильно. Если я сначала открою профиль или магазин, то дом отобразит тот вид, который был у меня в последний раз, магазин или профиль.

Я подозреваю, что это, возможно, что-то вроде того, что URL-адрес одинаков за вычетом параметра состояния ретрансляции, поскольку изменение домашнего URL-адреса на что-то вроде https://google.com всегда работает, и у меня не возникает никаких проблем между профилем и магазином.

Я использую одноэлементный экземпляр WKProcessPool для обмена файлами cookie, и, напечатав в de init, веб-просмотр разрушается после его закрытия.

import WebKit

class BaseWKWebViewController: UIViewController {

    var requestURL: URL? {
        didSet {
            guard let requestURL = requestURL else { return }
            loadURL(requestURL)
        }
    }

    private var sessionCookies: [HTTPCookie] {
        var __cookies = [HTTPCookie]()

        webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
            __cookies = cookies.filter({ cookie -> Bool in
                cookie.name.contains("IDENTITY") || cookie.name.contains("AUTH_SESSION_ID")
            })
        }

        return __cookies
    }

    lazy var webView: WKWebView = {
        let webConfiguration = WKWebViewConfiguration()
        webConfiguration.dataDetectorTypes = [.all]
        webConfiguration.processPool = ProcessPool.shared
        let webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.navigationDelegate = self
        webView.allowsBackForwardNavigationGestures = false
        return webView
    }()

    private var estimatedProgressObserver: NSKeyValueObservation?
    private let progressView = UIProgressView(progressViewStyle: .default)

    override func loadView() {
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setupProgressView()
        setupEstimatedProgressObserver()
    }

    func loadURL(_ url: URL) {
        let request = URLRequest(url: url)
        webView.load(URLRequest(url: url), with: sessionCookies)
    }

    private func setupProgressView() {
        progressView.trackTintColor = theme.color(.gray)
        progressView.progressTintColor = theme.color(.primary)
        view.addSubview(progressView)
        progressView.anchor(top: view.topAnchor, leading: view.leadingAnchor, trailing: view.trailingAnchor, size: .init(width: 0, height: 4))
        progressView.isHidden = true
    }

    private func setupEstimatedProgressObserver() {
        estimatedProgressObserver = webView.observe(\.estimatedProgress, options: [.new]) { [weak self] webView, _ in
            self?.progressView.progress = Float(webView.estimatedProgress)
        }
    }
}

extension BaseWKWebViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url, let host = url.host {
            if host.contains("test.co.uk") || host.contains(configValue(forKey: "APP_DOMAIN")) || host.contains("hub.com") {
                decisionHandler(.allow)
                return
            }

            UIApplication.shared.open(url)
            decisionHandler(.cancel)
        }
    }



    func webView(_: WKWebView, didStartProvisionalNavigation _: WKNavigation!) {
        if progressView.isHidden {
            progressView.isHidden = false
        }

        UIView.animate(withDuration: 0.33, animations: { self.progressView.alpha = 1.0 })
    }

    func webView(_: WKWebView, didFinish _: WKNavigation!) {
        UIView.animate(withDuration: 0.33, animations: { self.progressView.alpha = 0.0 }) { isFinished in
            self.progressView.isHidden = isFinished
        }
    }
}

extension BaseWKWebViewController: Brandable { }

Мой синглтон WKProcessPool

class ProcessPool {
    static let shared = WKProcessPool()
}

* * * * * * * * * * * * URL исходят из API как есть, я просто сохраняю их как URL на модели, используя Codable, я ничего не делаю с путями или параметрами, возможно, это проблема?

...