Как использовать один и тот же куки на разных WKWebViews - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно использовать ту же конфигурацию (cookie) для второго WebView после того, как пользователь авторизован на первом WebView.На симуляторе работает хорошо, но на устройстве не стабильно.

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()
    }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Каждый ** WKWebView ** имеет свое собственное пространство cookie, в котором пространство cookie сохраняется в WKProcessPool , просто сделайте объект пула процессов глобальным и назначьте его каждому объекту веб-просмотра, надеемся, что это будет работать в вашем случае.

    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 и установите в пользовательском скрипте wkwebview для дальнейшего, вы также можете проверить мой ответ здесь. Могу ли я установить файлы cookie, которые будут использоваться WKWebView?

0 голосов
/ 22 сентября 2018

Вам необходимо установить cookie для каждого wkwebview, поэтому сохраните значение cookie в качестве глобальной переменной или сохраните его в plist.

...