在WKHTTPCookieStore中设置cookie时,WKWebView不会更新document.cookie

Zac*_*ack 6 cookies ios cordova wkwebview wkhttpcookiestore

内容

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

<content src="xyz://host.domain.com/app" />
<allow-navigation href="xyz://*/*" />
Run Code Online (Sandbox Code Playgroud)

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

[configuration setURLSchemeHandler:self forURLScheme:@"xyz"];
Run Code Online (Sandbox Code Playgroud)

将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
Run Code Online (Sandbox Code Playgroud)

使用NSURLSessionDataTask做出GEThttps://host.domain.com/app/foo我建立NSHTTPCookie从物体Set-Cookie上面的响应报头,并将其存储在WKHTTPCookieStore我的WKWebView使用

[wkWebView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{
    NSLog(@"SET COOKIE\n%@", cookie);
}];
Run Code Online (Sandbox Code Playgroud)

按照这个答案。Cookies设置正确,可以使用进行检索

[wkWebView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
    //Print cookies
}];
Run Code Online (Sandbox Code Playgroud)

有趣的一点:

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

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

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

我期待看到所有 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,一切正常。在这方面,我完全不知所措。我能找到的唯一类似的问题是这个这个,但没有运气。NSHTTPCookieStoragehttps

我在这里真的错过了什么吗?


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