是否可以使用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:
提取cookie并将它们填充到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
提取properties
的NSDictionary
对象,然后把字典写到磁盘上,读回来就像使用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之前,它自动工作)。