Swift 如何在不同的Web视图上使用相同的cookie
在用户在第一个WebView上获得授权后,我需要在第二个WebView上使用相同的配置(cookie)。在模拟器上运行良好,但在设备上不稳定Swift 如何在不同的Web视图上使用相同的cookie,swift,wkwebview,wkwebviewconfiguration,Swift,Wkwebview,Wkwebviewconfiguration,在用户在第一个WebView上获得授权后,我需要在第二个WebView上使用相同的配置(cookie)。在模拟器上运行良好,但在设备上不稳定 class auth: UIViewController, WKNavigationDelegate, UIWebViewDelegate { private var webView: WKWebView = WKWebView() override func viewDidLoad() { super.viewDidLoad()
class auth: UIViewController, WKNavigationDelegate, UIWebViewDelegate {
private var webView: WKWebView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
loadPage(urlString: link)
}
private func loadPage(urlString: String) {
if let encodedURL = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: encodedURL) {
let request = URLRequest(url: url)
webView.refreshCookies()
webView.load(request)
}
}
}
extension WKWebView {
func refreshCookies() {
self.configuration.websiteDataStore = WKWebsiteDataStore.default()
}
}
您需要为每个wkwebview设置cookie,因此将cookie值保留为全局变量或保存在plist中。您需要为每个wkwebview设置cookie,因此,请将cookie值保留为全局变量或保存在plist中。每个**WKWebView**都有自己的cookie空间,cookie空间保存在WKProcessPool中,只需将进程池对象设为全局并分配给每个webview对象,希望这在您的情况下能够起作用
static let processPool = WKProcessPool()
每次使用此进程池设置WKWebView实例,另一种方法是在创建WKWebView并加载时实现此功能
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
// use to sync cookies
guard let response = navigationResponse.response as? HTTPURLResponse, let responseUrl = navigationResponse.response.url else {
decisionHandler(.cancel)
return
}
if #available(iOS 11.0, *) {
self.webView.httpCookieStore.getAllCookies { (cookies) in
cookies.forEach({ (cookie) in
if cookie.name == Constant.appCodeCookie || cookie.name == Constant.rpgaCookieName || cookie.name == Constant.headerCookie , cookie.name == Constant.adIdCookie {
HTTPCookieStorage.shared.setCookie(cookie)
}
})
}
} else {
// Fallback version
if let allHttpHeaders = response.allHeaderFields as? [String: String] {
let cookies = HTTPCookie.cookies(withResponseHeaderFields: allHttpHeaders, for: responseUrl)
for cookie in cookies {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
}
decisionHandler(.allow)
}
每次创建wkwebview实例时,只需从httpcookiestorage获取所有cookies,并在wkwebview用户脚本中设置,以便进一步了解,您也可以在此处查看我的答案 每个**WKWebView**都有自己的cookie空间,cookie空间保存在WKProcessPool只需将进程池对象设置为全局对象并分配给每个webview对象,希望在您的情况下也能这样做
static let processPool = WKProcessPool()
每次使用此进程池设置WKWebView实例,另一种方法是在创建WKWebView并加载时实现此功能
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
// use to sync cookies
guard let response = navigationResponse.response as? HTTPURLResponse, let responseUrl = navigationResponse.response.url else {
decisionHandler(.cancel)
return
}
if #available(iOS 11.0, *) {
self.webView.httpCookieStore.getAllCookies { (cookies) in
cookies.forEach({ (cookie) in
if cookie.name == Constant.appCodeCookie || cookie.name == Constant.rpgaCookieName || cookie.name == Constant.headerCookie , cookie.name == Constant.adIdCookie {
HTTPCookieStorage.shared.setCookie(cookie)
}
})
}
} else {
// Fallback version
if let allHttpHeaders = response.allHeaderFields as? [String: String] {
let cookies = HTTPCookie.cookies(withResponseHeaderFields: allHttpHeaders, for: responseUrl)
for cookie in cookies {
HTTPCookieStorage.shared.setCookie(cookie)
}
}
}
decisionHandler(.allow)
}
每次创建wkwebview实例时,只需从httpcookiestorage获取所有cookies,并在wkwebview用户脚本中设置,以便进一步了解,您也可以在此处查看我的答案 您可以在共享的HTTPCookieStorage中设置cookie,而不是像上面提到的那样保留全局cookie变量或保存到plist 储存:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let request = navigationAction.request
let url = request.url
webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { (cookies) in
HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: nil)
}
decisionHandler(.allow)
return
}
以及检索和设置(在不同的WebView实例中):
希望这有帮助您可以在共享的HTTPCookieStorage中设置cookie,而不是像上面提到的那样保留全局cookie变量或保存到plist 储存:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let request = navigationAction.request
let url = request.url
webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { (cookies) in
HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: nil)
}
decisionHandler(.allow)
return
}
以及检索和设置(在不同的WebView实例中):
希望这是有帮助的