问题标签 [wkhttpcookiestore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
888 浏览

ios11 - WKHTTPCookieStore 未检索设置的 Cookie。

我正在尝试以编程方式设置 cookie,但它不起作用。cookie 给人的印象是它是有效的。然后我把它设置在WKWebsiteDataStore.default().httpCookieStore. 在异步回调中,我尝试将所有 cookie 从存储中取出。但是,我的 cookie 不存在。去哪儿了!?

0 投票
2 回答
1241 浏览

ios - WKHTTPCookieStorage 的 setCookie 在关闭和打开 Web 视图后不返回

我有下面的代码将 cookie 从 general 复制HTTPCookieStorage到我的 webview 的 cookie 存储中。复制所有 cookie 后,我加载 webview

这段代码第一次运行时就可以工作——所有的 cookie 都被设置,setCookie完成处理程序被调用并且调度组被通知。

但是,在关闭此 Web 视图并打开它setCookie的 n 次运行(通常是 3 或 4 次)之后,完成处理程序会停止返回,通常是无限期地返回。有一些竞争条件正在发生,因为如果我设置断点并在每次 web 视图打开时点击它们,这个问题就永远不会发生。发生一次后,设置断点有时会使其重新开始工作,有时什么也不做。

注意:这只发生在设备上。在模拟器上,这永远不会发生。

没有关于setCookiecompletionHandler 何时应该返回或不返回的文档,而且这是一个竞争条件,当你有断点时通常不会发生这种情况,这使得调试变得异常困难。

有没有其他人经历过这个?有什么建议吗?我尝试在几个地方明确设置 WKProcessPool,但没有成功。我尝试在创建配置之前和之后创建 Web 视图。我已经尝试了很多东西,但仍然失败了

0 投票
0 回答
321 浏览

swift - WKWebView 在模拟器上首次加载时始终未经身份验证 - 然后在所有后续加载时都经过身份验证

在我的应用程序中,我正在加载一个需要在 WKWebView 中进行身份验证的页面。在设备上,它总是在首次加载时进行身份验证,因为我有适当的 cookie 来对其进行身份验证。但是,如果我在模拟器上“擦除所有内容设置”(在顶部栏中的“硬件”菜单下),那么 Web 视图的第一次加载总是未经身份验证的(即使我有正确的 cookie),随后的加载是始终经过身份验证。

这不会在设备上发生,并且在我设置断点时也不会发生,这意味着它是某种与模拟器相关的竞争条件。

这是我用于从我的 Web 视图中从常规 cookie 存储更新 cookie 的代码。

我在这里做错了吗?这是关于我的身份验证 cookie 是“HTTPOnly”而 WebKit 没有正确处理它们的问题吗?其他人遇到过这个问题吗?

0 投票
2 回答
2898 浏览

ios - WKWebview getAllCookies 在 iOS 11.3 中崩溃

我们最近迁移到了 WKWebview。我们为 cookie 更改添加了一个监听器,以获取更新的 cookie 并更新我们自己的商店。

加载控制器后,它会调用 cookiesDidChangeInCookieStore 并在“getAllCookies”处崩溃。但这种崩溃仅发生在 TestFlight/Fabric 构建中。当我从 xcode 直接在设备上运行应用程序时(在调试和发布模式下)不会发生。以下是崩溃报告,

调用 getAllCookies 时似乎存在溢出。这仅在 iOS 11.3 中发生。

0 投票
1 回答
1006 浏览

ios - WKHTTPCookieStore getAllCookies 崩溃

我打电话时发生了奇怪的崩溃getAllCookies()

崩溃只能在装有 iOS 11.3.1 的真实设备上重现。在模拟器上工作正常。

Xcode 控制台中的崩溃说:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURL length]: unrecognized selector sent to instance 0x10fc42790'

Crashlytics 上的崩溃:

在主线程中异步调用getAllCookies,不解决问题。

0 投票
3 回答
16383 浏览

ios - WKWebView 无法设置 Cookie (iOS 11+)

我正在拼命地尝试将自定义 cookie 添加到WKWebView实例中(不使用 Javascript 或类似的解决方法)。

从 iOS 11 及更高版本开始,Apple 提供了一个 API 来执行此操作:WKWebViewsWKWebsiteDataStore有一个 property httpCookieStore

这是我的(示例)代码:

在此之后,如果我使用webView.configuration.websiteDataStore.httpCookieStore.getAllCookies(completionHandler:)我会看到我的 cookie 在 cookie 列表中。

但是,当使用 Safari 的开发工具(当然是使用 iOS 模拟器)检查 webview 时,cookie 不会显示。

我还尝试使用 HTTP 代理(在我的例子中为 Charles)检查流量,以查看我的 HTTP 请求中是否包含 cookie。它不是。

我在这里做错了什么?如何将 cookie 添加到WKWebView(在 iOS 11 及更高版本上)?

0 投票
1 回答
1569 浏览

ios - 在某些操作系统版本中未调用 WKHTTPCookieStore getAllCookies 完成处理程序

我们的 iOS 应用程序从中读取 cookieWKHTTPCookieStore以调用初始化 Web 服务。如果我们要查找的特定 cookie 不存在于 CookieStore 中,则将在 web 服务中传递空值并返回相关响应。由于这是一个初始化 API,我们在完成处理程序中调用 web 服务,如下所示,并通过添加活动指示器来阻止 UI,直到它给出成功或失败。

在我们的测试中,它在从 iOS 11.3 到 12.2 的所有可用测试设备上运行良好。

当前的问题是生产应用程序有一个奇怪的行为,即活动指示器在安装后根本没有消失。我们发现根本原因是WKHTTPCookieStore.getAllCookies完成处理程序从未被调用,因此它阻塞了 UI。该问题主要在 iOS 11.2.x 操作系统版本中观察到,但不确定它是否也会影响任何其他操作系统版本。即使重新启动应用程序也不能解决问题。

有没有人遇到过这个问题?有什么解决方法/解决方法可以解决这个问题吗?

0 投票
0 回答
117 浏览

session-cookies - 为什么WKHTTPCookieStore的API——getAllCookies调用了completionHandler却没有session cookies包含

WKNavigationResponse 在 iOS 12 中不再通过其 response.header 提供对 cookie 的访问,

所以,我必须使用新的 API 来获取所有的 cookie。当我使用时getAllCookies:,有时它没有调用completionHandler,有时它调用了没有会话cookie 包含的completionHandler。在某些情况下,我需要获取会话 cookie。

为什么WKHTTPCookieStore的API——getAllCookies总是不能调用completionHandler?还有,为什么有时候调用completionHandler却没有session cookies包含?

或者,有没有办法从 WKWebView 获取所有包含会话 cookie 的 cookie?

0 投票
1 回答
758 浏览

swift - 如何使用 WKWebView / WKHTTPCookieStore 在应用重新启动时保留 cookie

我需要在应用程序重新启动时保留我的 cookie。

最初在使用时,UIWebView我可以通过扩展来实现这一点UserDefaults

然后我会在各种生命周期方法中调用它

但是现在我的应用程序正在使用WKWebView并且我有相同的要求。我目前通过共享单例在我的应用程序中的不同 Web 视图之间共享 cookie 存储WKProcessPool

但是,在重新启动时,某些 cookie 不会保留。主要是没有exp日期且无法在服务器上更新以拥有日期的 cookie。

上面的扩展正在使用,HTTPCookieStorage但是我需要使用相同的方式(或更好的方式)来实现某些东西,但我WKHTTPCookieStore不确定如何使用。

我希望做这样的事情

但我不相信WKHTTPCookieStore可以以这种方式调用。

我也非常了解 cookie 等敏感数据的问题UserDefaults,这不是一个生产应用程序,并且在发布之前很久就会删除此功能并替换为适当、安全的解决方案。遗憾的是,这正是我们目前使用产品的地方。

0 投票
0 回答
1007 浏览

ios - WKWebView 在 WKHTTPCookieStore 中设置 cookie 时不更新 document.cookie

上下文

我有一个 iOS Cordova 应用程序,使用WKWebView. 我需要拦截WKWebView使用方案不可能的请求http|https(可以使用UIWebView但我必须移动到WKWebView)。因此我在科尔多瓦的config.xml

并且我已配置WKWebView为处理(拦截)xyz://方案:

将 Safari 检查器附加到我的 iPhonedocument.origin输出后xyz://host.domain.com

假设 a使用以下标头GET进行响应:https://host.domain.com/app/foo

使用我从上面NSURLSessionDataTaskGET响应头https://host.domain.com/app/foo构建NSHTTPCookie对象并将它们存储在我的使用中Set-CookieWKHTTPCookieStoreWKWebView

按照这个答案。cookie 已正确设置并且可以使用


有趣的一点:

设置 cookie 后,我将 Safari 检查器附加到我的 iPhone 并:

  • Cookiea=1在 Safari 检查器的存储中显示
  • Cookieb=2并且c=3 显示在 Safari 检查器的存储中
  • document.cookie总是返回""(JS 无法访问 cookie)

问题 #1: 为什么a=1Safari 检查器的存储部分中只显示 cookie?

我期待看到所有的饼干。它似乎与Secure标志有关,但可能是 Safari 检查器中的错误(或功能),因为在 Google Chrome 上检查随机站点会显示所有 cookie,而不管Secure标志如何。

问题#2: 为什么document.cookie总是返回""

即使document.cookie="foo=bar; expires=Tue, 14 Oct 2024 20:23:32 GMT; domain=host.domain.com; path=/"直接在检查器中执行,document.cookie仍然返回"",就像由于某种原因它是只读的一样。

UIWebView使用,NSHTTPCookieStorage和标准https方案一切正常。我在这方面完全不知所措。我能找到的唯一类似的问题是这个这个,但没有运气。

我在这里错过了一些非常明显的东西吗?


TL;DR iOS Cordova 应用程序使用WKWebView和自定义 url 方案不会将本机代码中设置的 cookie 公开给 JavaScript(document.cookie总是"")。