菜鸟教程小白 发表于 2022-12-11 19:27:42

ios - 从 WKWebView 获取所有 cookie


                                            <p><p>虽然使用 <code>NSHTTPCookieStorage.sharedHTTPCookieStorage()</code> 从 <code>UIWebView</code> 获取 cookie 似乎很简单,但似乎 <code>WKWebView</code> 将 cookie 存储在其他地方。</p>

<p>我做了一些研究,我能够从 <code>NSHTTPURLResponse</code> 对象中获取一些 cookie。然而,这并不包含 <code>WKWebView</code> 使用的所有 cookie:</p>

<pre><code>func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -&gt; Void) {

if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
    if let headers = httpResponse.allHeaderFields as? , url = httpResponse.URL {
      let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url)

      for cookie in cookies {
      logDebug(cookie.description)

      logDebug(&#34;found cookie &#34; + cookie.name + &#34; &#34; + cookie.value)
      }
    }
}
}
</code></pre>

<p>奇怪的是,ios 9 中还有一个类 <code>WKWebsiteDataStore</code> 负责管理 <code>WKWebView</code> 中的 cookie,但是该类不包含检索 cookie 数据的公共(public)方法:</p>

<pre><code>let storage = WKWebsiteDataStore.defaultDataStore()

storage.fetchDataRecordsOfTypes(, completionHandler: { (records) -&gt; Void in
for record in records {
    logDebug(&#34;cookie record is &#34; + record.debugDescription)

    for dataType in record.dataTypes {
      logDebug(&#34;data type is &#34; + dataType.debugDescription)

      // get cookie data??
    }
}
})
</code></pre>

<p>是否有获取 cookie 数据的解决方法?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>WKWebView</code> 使用(创建)的 Cookie 实际上正确地存储在 <code>NSHTTPCookieStorage.sharedHTTPCookieStorage()</code> 中。</p>

<p>问题是 <code>WKWebView</code> 不会立即写回 cookie。我认为它是按照自己的时间表进行的。例如,当 <code>WKWebView</code> 关闭或可能定期关闭时。</p>

<p>所以最终他们确实会在那里结束,但<em>何时</em>是不可预测的。</p>

<p>您可以通过关闭您的 <code>WKWebView</code> 来强制“同步”到共享的 <code>NSHTTPCookieStorage</code>。请让我们知道这是否有效。</p>

<p><strong>更新</strong>:我只记得在 <a href="https://github.com/mozilla/firefox-ios" rel="noreferrer noopener nofollow">Firefox for iOS</a>我们强制 <code>WKWebView</code> 刷新其内部数据,包括 cookie,方法是将其 <code>WKProcessPool</code> 替换为新的。没有官方 API,但我很确定这是目前最可靠的解决方法。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 WKWebView 获取所有 cookie,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47834699/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47834699/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 WKWebView 获取所有 cookie