上下文:
我有一个 iOS Cordova 应用程序,使用WKWebView
. 我需要拦截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 检查器附加到我的 iPhonedocument.origin
输出后xyz://host.domain.com
。
假设 a使用以下标头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
WKHTTPCookieStore
WKWebView
[wkWebView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{
NSLog(@"SET COOKIE\n%@", cookie);
}];
按照这个答案。cookie 已正确设置并且可以使用
[wkWebView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
//Print cookies
}];
有趣的一点:
设置 cookie 后,我将 Safari 检查器附加到我的 iPhone 并:
- Cookie
a=1
在 Safari 检查器的存储中显示 - Cookie
b=2
并且c=3
不显示在 Safari 检查器的存储中 document.cookie
总是返回""
(JS 无法访问 cookie)
问题 #1: 为什么a=1
Safari 检查器的存储部分中只显示 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
总是""
)。