在WKHTTPCookieStore

时间:2019-06-19 00:53:53

标签: ios cordova cookies wkwebview wkhttpcookiestore

上下文

我有一个使用WKWebView的iOS Cordova应用程序。我需要拦截WKWebView请求,这是使用http|https方案无法实现的(可以使用UIWebView,但我必须移至WKWebView)。因此,我将科尔多瓦的config.xml

<content src="xyz://host.domain.com/app" />
<allow-navigation href="xyz://*/*" />

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

[configuration setURLSchemeHandler:self forURLScheme:@"xyz"];

将Safari检查器连接到我的iPhone后,document.origin输出xyz://host.domain.com

假设GEThttps://host.domain.com/app/foo的响应具有以下标头:

Set-Cookie: a=1; Domain=host.domain.com; Path=/
Set-Cookie: b=2; Domain=host.domain.com; Path=/; Secure
Set-Cookie: c=3; Domain=host.domain.com; Path=/; Secure; HttpOnly

使用NSURLSessionDataTaskGET进行https://host.domain.com/app/foo,我从上方的NSHTTPCookie响应标头构建Set-Cookie对象,并将它们存储在{{1 }} WKHTTPCookieStore中使用

WKWebView

按照this answer。 Cookie设置正确,可以使用

进行检索
[wkWebView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{
    NSLog(@"SET COOKIE\n%@", cookie);
}];

有趣的位:

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

  • Cookie [wkWebView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) { //Print cookies }]; 显示在Safari检查器的存储中
  • Cookie a=1b=2 显示在Safari检查器的存储中
  • c=3始终返回document.cookie(JS无法访问cookie)

问题1: 为什么在Safari检查器的“存储”部分中仅显示Cookie ""

我原本希望看到所有 cookie。它似乎与a=1标志有关,但可能是Safari检查器中的错误(或功能),因为在Google Chrome浏览器上检查随机站点会显示所有cookie,而与Secure标志无关。

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

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

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

我在这里真的缺少明显的东西吗?


TL; DR 使用https和自定义url方案的iOS Cordova应用程序不会将本机代码中设置的cookie暴露给JavaScript(WKWebView始终为document.cookie)。

0 个答案:

没有答案