У меня есть 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
, я ничего не делаю с путями или параметрами, возможно, это проблема?