上下文:
我有一个使用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
。
假设GET
至https://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
使用NSURLSessionDataTask
对GET
进行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上:
[wkWebView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
//Print cookies
}];
显示在Safari检查器的存储中a=1
和b=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
方案,一切正常。在这方面,我完全不知所措。我可以找到的唯一类似问题是this和this,但是没有运气。
我在这里真的缺少明显的东西吗?
TL; DR
使用https
和自定义url方案的iOS Cordova应用程序不会将本机代码中设置的cookie暴露给JavaScript(WKWebView
始终为document.cookie
)。