是否可以使用sharedHTTPCookieStorage为UIWebView手动设置Cookie?

我有一个iOS应用程序内的webviews,需要一个身份validationcookie进行正确的身份validation。 我正在寻找一种方法来设置一个iOS应用程序的web视图内的cookie,而不必做一个出站请求来设置cookie,因为我已经在客户端的身份validation信息。

这篇文章向我们展示了UIWebView cookie的存储位置。

现在我正在加载一个隐藏的Web视图来发出一个出站请求,但是不希望做出设置一个简单的cookie的外部请求。

是的,你可以做到这一点。 首先,在applicationDidBecomeActive中添加这一行

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

CookieAcceptPolicy是跨应用程序共享的,可以在您不知情的情况下进行更改,因此您希望确保每次运行应用程序时都拥有您所需的接受政策。

然后,设置cookie:

 NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; [cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName]; [cookieProperties setObject:@"someValue123456" 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 or any NSDate of your choosing // this makes the cookie sessionless and it will persist across web sessions and app launches /// if you want the cookie to be destroyed when your app exits, don't set this [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires]; NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 

这个cookie的名字是testCookie,值是someValue123456,并且会和任何http请求一起发送到www.example.com。

有关设置Cookie的一个大警告,请在这里看到我的问题!

NSHTTPCookieStorage状态没有保存在应用程序退出。 那里有任何明确的知识/文件?

编辑:适应编辑的问题

NSHTTPCookieStorage有一个-setCookies:forURL:mainDocumentURL:方法,所以要做的很简单的事情就是使用NSURLConnection并实现-connection:didReceiveResponse: -setCookies:forURL:mainDocumentURL:提取cookies并将它们填充到cookie jar中:

 - ( void )connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSArray *cookies; cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields: [ httpResponse allHeaderFields ]]; [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] setCookies: cookies forURL: self.url mainDocumentURL: nil ]; } 

(你也可以简单地从NSHTTPCookie提取propertiesNSDictionary对象,然后把字典写到磁盘上,读回来就像使用NSDictionary-dictionaryWithContentsOfFile:然后用-dictionaryWithContentsOfFile:创buildcookie一样简单)

然后,您可以在需要时将Cookie从存储器中取出。

 - ( void )reloadWebview: (id)sender { NSArray *cookies; NSDictionary *cookieHeaders; NSMutableURLRequest *request; cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] cookiesForURL: self.url ]; if ( !cookies ) { /* kick off new NSURLConnection to retrieve new auth cookie */ return; } cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ]; request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ]; [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ] forHTTPHeaderField: @"Cookie" ]; [ self.webView loadRequest: request ]; [ request release ]; } 

在Swift 3中,所有的键都被包装在HTTPCookiePropertyKey结构中:

 let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name", .value : "value", .domain : "www.example.com", .originURL : "www.example.com", .path : "/", .version : "0", .expires : Date().addingTimeInterval(2629743) ] if let cookie = HTTPCookie(properties: cookieProperties) { HTTPCookieStorage.shared.setCookie(cookie) } 

有必要解决iOS 10引入的cookie的限制,这使得它们在不同的进程中不可见。

这意味着在具有多处理function的设备上,网页浏览与您的应用程序是截然不同的,这意味着您的“应用程序”会话不会自动传输到networking视图。

所以在本质上,你需要做到这一点(甚至是以前的海报,在iOS10之前,它自动工作)。