Поделиться сессией между несколькими WKWebView
Мне нужно реализовать логику биллинга. Он делает несколько перенаправлений, а затем открывает новый фрейм в новом окне - вот как это работает в веб-браузере.
Я показываю платежную рамку в WKWebView. Я ловлю момент, когда он хочет открыть новый фрейм (navigationAction.targetFrame.isNil) и прошу webView загрузить новый запрос. Новый фрейм загружается, но некоторые перенаправления не происходят, и биллинг показывает мне ошибку. Похоже, сессия потеряна.
Я попробовал другой способ: загрузить новый запрос в новом webView. Когда я инициализирую webView, я передаю processPull из предыдущего, следуя этой статье: https://github.com/ShingoFukuyama/WKWebViewTips Проблема не была решена.
lazy var webView: WKWebView = { [unowned self] in
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
preferences.javaScriptCanOpenWindowsAutomatically = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
let webView = WKWebView(frame: CGRect.zero, configuration: configuration)
webView.navigationDelegate = self
webView.UIDelegate = self
webView.estimatedProgress
webView.scrollView.backgroundColor = UIColor.binomoDarkGrey()
self.view.addSubview(webView)
webView.snp_makeConstraints { [unowned self] (make) in
make.edges.equalTo(self.view)
}
return webView
}()
// MARK: WKNavigationDelegate
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
if navigationAction.targetFrame.isNil {
decisionHandler(.Cancel)
webView.loadRequest(navigationAction.request)
} else {
decisionHandler(.Allow)
}
}
1 ответ
Я решил проблему довольно сложно, установив целевой атрибут из JavaScript.
extension WebKitViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let js = "document.getElementsByTagName('form')[0].setAttribute('target', '_self')"
webView.evaluateJavaScript(js, completionHandler: nil)
}
}