2011-05-10 94 views
69

我有一個iOS應用程序內的webviews需要一個身份驗證cookie進行正確的身份驗證。我正在尋找一種方法來在iOS應用程序的webview中設置一個cookie,而不必創建一個出站請求來設置cookie,因爲我已經在客戶端上擁有認證信息。是否可以使用sharedHTTPCookieStorage爲UIWebView手動設置cookie?

post向我們展示了UIWebView cookie的存儲位置。

現在我加載一個隱藏的網絡視圖,使呼出請求,但不希望有使設置一個簡單的cookie外部請求。

回答

128

是的,你可以做到這一點。首先,在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 state not saved on app exit. Any definitive knowledge/documentation out there?

+0

NSHTTPCookieStorage肯定會完全實現一個持久性cookie存儲。這只是在服務器端正確設置cookie生命週期的問題。 – Till 2011-05-10 19:36:21

+0

是的,它確實實現了持久cookie存儲。唯一的問題是,當應用程序在Cookie設置後立即退出時,它會失敗。 – kball 2011-05-10 19:47:17

+1

球,我們結束了這個解決方案,它非常接近您的答案:http://lists.apple.com/archives/Webkitsdk-dev/2003/Sep/msg00003.html – 2011-05-10 20:33:19

14

編輯:適應編輯的問題

NSHTTPCookieStorage-setCookies:forURL:mainDocumentURL:方法,所以容易的事是使用NSURLConnection和實施-connection:didReceiveResponse:,提取餅乾和它們塞進餅乾罐:

- (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 ]; 
} 

(你也可以簡單地提取從NSHTTPCookieproperties一個NSDictionary對象,然後寫字典中的磁盤。讀它放回就像使用一樣方便。NSDictionary-dictionaryWithContentsOfFile:,然後創建與-initWithProperties:餅乾)

然後你就可以拉餅乾背出存儲的,當你需要它:

- (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 ]; 
} 
+1

無需手動管理NSHTTPCookieStorage這種方式。每當URL加載系統使用HTTP並且cookie接受策略設置爲接受cookie時,NSHTTPCookieStorage將自動進行管理 - 如果設置爲響應頭,則存儲Cookie,並在發送請求時設置存儲的cookie的頭。 – kball 2011-05-10 19:52:08

+0

當然。當然,這種方法意味着開發人員不知道每個請求會保存和發送哪些cookie,如果網站設置了不需要的跟蹤cookie,這可能是不可取的。完全使用NSHTTPCookieStorage也可以是一個重量級解決方案,但通常只在Mac OS X上。例如,請參閱:http://www.cocoabuilder.com/archive/cocoa/169235-nsurlconnection-without-nshttpcookiestorage.html – 2011-05-10 20:14:26

+1

欣賞很長的答案,儘管設置一個cookie似乎有相當多的工作量。我們最終這樣做了:http://lists.apple.com/archives/Webkitsdk-dev/2003/Sep/msg00003.html – 2011-05-10 20:34:36

1

有需要解決的限制對iOS的10,這使得他們看不到不同的工藝介紹餅乾。

這意味着,在多處理能力的設備,網頁視圖是一個不同的過程,然後你的應用程序,這意味着你的「應用程序」的會話沒有到網頁視圖自動發送了。

所以在本質上,你需要做到這一點(甚至是以前的海報,正確的,它是在iOS10之前自動工作)。

3

在斯威夫特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) 
} 
相關問題