Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在不同的Web视图上使用相同的cookie_Swift_Wkwebview_Wkwebviewconfiguration - Fatal编程技术网

Swift 如何在不同的Web视图上使用相同的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()

在用户在第一个WebView上获得授权后,我需要在第二个WebView上使用相同的配置(cookie)。在模拟器上运行良好,但在设备上不稳定

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实例中):

希望这是有帮助的