2012-07-19 128 views
12

我開發,其中服務器遞給我一個cookie來識別用戶的應用程序不堅持餅乾。共享NSHTTPCookieStorage實例

我連續請求需要有一個cookie來具有用戶所期望的響應。 我無法理解的是NSHTTPCookieStorage的共享實例如何以及何時丟失了其Cookie。

我使用的第一個解決方案是存檔和從我的服務器餅乾保存到應用終端從我的應用程序啓動服務器,然後清除現有的用戶默認設置和重置我儲存的人。 通過開發過程,我沒有遇到問題,因爲調試會話非常短,通常不需要將應用程序放在後臺。

在beta測試期間,麻煩開始了。 我附帶的破解是不僅在應用程序終止時保存cookie,而且在將這些cookie遞給我的API調用之後也保存這些cookie。並且不僅在應用程序啓動時加載保存的Cookie,而且在應用程序返回到前臺時也加載。

NSHTTPCookieStorage共享實例如何擺脫這些cookie以及處理它的最佳做法是什麼,因爲它是我的應用程序的重要組成部分,如果沒有經驗豐富的開發人員備份,我不能相信這樣的黑客解決方案。

預先感謝您爲您的回答

編輯: 這裏有保存方法/讀/清除餅乾

-(void)saveStoredCookies 
{ 
    NSURL *httpUrl = @"http://myServer.com"; 
    NSURL *httpsUrl = @"https://myServer.com"; 

    NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl]; 
    NSData *httpCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpCookies]; 
    [[NSUserDefaults standardUserDefaults] setObject:httpCookiesData forKey:@"savedHttpCookies"]; 

    NSArray *httpsCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl]; 
    NSData *httpsCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpsCookies]; 
    [[NSUserDefaults standardUserDefaults] setObject:httpsCookiesData forKey:@"savedHttpsCookies"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

-(void)readStoredCookies 
{ 
    //clear, read and install stored cookies 
    NSURL *httpUrl = @"http://myServer.com"; 
    NSURL *httpsUrl = @"https://myServer.com"; 

    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl]; 
    for (NSHTTPCookie *cookie in cookies) { 
     [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
    } 
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl]; 
    for (NSHTTPCookie *cookie in cookies) { 
     [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
    } 

    NSData *httpCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpCookies"]; 
    if([httpCookiesData length]) { 
     NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpCookiesData]; 
     for (NSHTTPCookie *cookie in savedCookies) { 
      [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 
     }  
    } 
    NSData *httpsCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpsCookies"]; 
    if([httpsCookiesData length]) { 
     NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpsCookiesData]; 
     for (NSHTTPCookie *cookie in savedCookies) { 
      [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 
     }  
    } 
} 

-(void)clearStoredCookies 
{ 
    NSURL *httpUrl = @"http://myServer.com"; 
    NSURL *httpsUrl = @"https://myServer.com"; 
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl]; 
    for (NSHTTPCookie *cookie in cookies) { 
     [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
    } 
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl]; 
    for (NSHTTPCookie *cookie in cookies) { 
     [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
    } 
} 
+0

請根據您使用的代碼進行更新,以便在發出新請求時將Cookie從Cookie存儲區中取出。你的描述是不夠的。 – 2012-08-09 03:23:50

+0

您沒有看到問題,因爲您無法在測試期間在新會話之間加載來自存儲的Cookie。 – 2012-08-09 03:27:15

回答

-1

解決!

經過一些簡單的調試後,我發現問題出在我在cookiesForURL:中使用的url。 我只是開始使用cookies屬性,現在它工作正常。

+0

請更新您的代碼,我處於相同情況 – Halid 2016-07-28 11:30:56

+0

對不起,但我無法再訪問該代碼。它是從4年前開始的。 – Moxy 2016-07-28 14:54:38

+0

@Moxy我需要幫助 – Siva 2017-09-15 09:04:52

18

NSHttpCookieStorage失去了它的餅乾,因爲你沒有設置過期時間餅乾。設置到期時間是必要的,否則當您的應用程序退出時,您的Cookie將會丟失。

這裏是一個快速瀏覽一下我是如何應用程序退出和發射過程中存儲了我的餅乾,

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; 
[cookieProperties setObject:name forKey:NSHTTPCookieName]; 
[cookieProperties setObject:strValue forKey:NSHTTPCookieValue]; 
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieDomain]; // Without http:// 
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieOriginURL]; // Without http:// 
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath]; 

// set expiration to one month from now or any future NSDate of your choice 
// 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]; 

希望這有助於。

+0

到期日期已由服務器設置 – Moxy 2012-08-10 20:10:33

+0

我將您的答案授予賞金,雖然它不是我的解決方案,但它讓我發現我在代碼中錯過的東西(使用我使用的URL,我沒有存儲任何Cookie) 。我現在正在度假,帶着我的衝浪課,我回家太累,無法觸摸我的代碼。當我改變某些東西時,我會編輯我的問題。 – Moxy 2012-08-12 18:59:44

2

馬雲可能是正確的 -

但是你不應該寫入cookie NSUserDefaults的到 -

的sharedHTTPCookieStorage的整點是你從那裏閱讀。

NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl]; 

出於安全原因,您甚至不應該能夠將這些cookie寫入NSUserDefaults。 但也許你可以。無論哪種方式,它可能超時沒有設置爲humayun提到。

無論哪種方式,請重構代碼,並儘量不要儲存cookies在使用者偏好。

+0

但問題是,他們不堅持共享HTTPCookieStorage。我已經檢查了從服務器傳遞過來的過期日期,並且設置的很好(在很長一段時間之前不會過期) – Moxy 2012-08-10 20:08:20

2

這是模擬器嗎?並使用滾動餅乾?

在模擬器,餅乾真的不堅持,因爲他們應該,因爲他們與桌面Safari瀏覽器共享。當餅乾翻轉時,最終會覆蓋另一個餅乾。

這不是設備本身,其中每個應用程序都有自己的cookie存儲上的問題。(而且,事實被告知,我還沒有注意到它在山獅隊發生的事情。)

+0

我正在使用真實設備 – Moxy 2012-08-12 18:45:05

+1

謝謝!試圖找出爲什麼cookie不會在模擬器上持續存在,從而讓我瘋狂。 – 2016-01-23 01:07:53