苦苦于解决这个问题并且不愿实施自定义cookie管理系统.
看来iOS的一些隐藏级别的HTTP实现无法正确管理无会话cookie.每当HTTP响应设置或删除cookie时,立即检查NSHTTPCookieStorage cookie将产生预期结果并指示正确的sessionOnly值.
但是,如果应用程序在响应更新cookie后立即退出,则重新启动时,这些sessionOnly = FALSE cookie将恢复为某个先前状态,并且最新更新将丢失.
是否通过响应头或NSHTTPCookieStorage setCookie设置/删除cookie:没有区别.
一些缓存/同步伏都教必须在幕后进行.cookie变为持久化所需的时间最长可达5秒.
在那里有谁或者可以指出这种行为的明确解释?这是一个简单明了的bug吗?还是一些我无法理解的无证特征?
您可以使用一些代码重现:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
NSHTTPCookie *cookie;
for (cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
NSLog(@"%@=%@", cookie.name, cookie.value);
}
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
// set expiration to one month from now
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
Run Code Online (Sandbox Code Playgroud)
此代码应在每次启动时输出新值.相反,您会看到如果您快速退出应用程序,则值将保持不变. …
我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 - 想象一下,如果用户登录,而不是"杀死"应用程序 - 由于存储此cookie会话的一些延迟将丢失:(.
问题似乎是cookie被缓存而不是立即保存到文件中.
(@Kemenaran从这里 - 下面的第5页)
我试图抓住他们的地方 -
webView:decidePolicyForNavigationResponse:decisionHandler:,
func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) {
if let httpResponse = navigationResponse.response as? NSHTTPURLResponse {
if let headers = httpResponse.allHeaderFields as? [String: String], url = httpResponse.URL {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headers, forURL: url {
for cookie in cookies {
NSHTTPCookieStorage.shared.set(cookie)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但并非所有请求都是导航,因此跳过一个cookie(在我的情况下),请参阅下面的详细信息
关于我试过的其他选项的几句话......
WKHTTPCookieStore提到.但我的项目应该支持iOS 9+我100%肯定,在登录后5-10秒,所需的cookie将保存到NSHttpCookieStorage(至少我几天的所有测试都确认)
我尝试使用提供的观察者NSHTTPCookieManagerCookiesChangedNotification,但它只为内部的cookie提供回调webView:decidePolicyForNavigationResponse:decisionHandler
我也尝试使用这里提到的一些JS来获取cookie …
我的 iPhone 应用程序有一个 UIWebView,它加载一个包含设置 cookie 的 javascript 的页面。似乎如果我设置 cookie 并在 10-15 秒内退出应用程序,那么 cookie 永远不会保存,但是如果我设置 cookie,等待 10-15 秒然后退出应用程序,cookie 就会被保存。
任何人都知道为什么会出现延迟以及如何立即保存 cookie。