2011-04-21 93 views
7

我需要一個註銷按鈕爲我的應用程序,我有下面的代碼:NSHTTPCookies拒絕被刪除

 while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) { 
      for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { 
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
      } 
     } 

(的同時,就在那裏,以確保他們被刪除,只運行一次不過)

如果我在上面的代碼之後記錄了共享cookie存儲的描述,它會輸出數組爲空的。然而,我終止了應用程序,或者關閉它,然後在應用程序啓動後第一件事情就是NSLog對共享cookie存儲的描述,所有的cookie仍然存在。

我曾嘗試在for循環設置Cookie爲零,甚至試圖發送的dealloc的餅乾(我知道你不應該這樣做,但現在我想任何東西)

+0

我剛剛把你的代碼放在我當前的項目中。首先,我用'NSLog(@「%@」,[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])來拋棄cookies;'然後執行你的代碼。重新啓動。餅乾不見了。奇怪! – 2011-04-21 16:37:59

+0

我遇到了同樣的問題,現在正在研究它。當我的應用程序假定某些cookie不見了時,它會引發很多衝突。 – casey 2011-09-29 20:19:55

+0

@casey,請回復你的發現(我會給出額外的代表) – 2011-09-29 21:35:00

回答

1

我發現以下代碼工作。

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
NSArray *cookieJar = [storage cookies]; 

for (NSHTTPCookie *cookie in cookieJar) 
{ 
    [storage deleteCookie:cookie]; 
} 
+0

建議,這只是起作用的許多SO帖子上出現,但是很具誤導性。 @ Kemenaran對這個問題的確切解釋,以及何時解決這個問題對於理解這個問題以及如何測試所有情況至關重要。 – Nariman 2013-03-17 20:26:03

3

問題似乎是緩存了cookies,並沒有立即保存到文件中。

如果您添加對[storage _saveCookies]的調用,那麼它可以工作 - 即使您之後直接終止應用程序,它們也會消失。當然,這種方法是私人API,所以它不會幫助你在App Store上。找到一些觸發它的方法是很好的!

我還發現,以下的CoreFoundation API工作得很好 - 但不幸的是它不是由蘋果外露:

extern CFTypeRef _CFHTTPCookieStorageGetDefault(); 
extern void CFHTTPCookieStorageDeleteAllCookies(CFTypeRef storage); 
extern void CFHTTPCookieStorageSyncStorageNow(CFTypeRef storage); 

...

CFTypeRef storage = _CFHTTPCookieStorageGetDefault(); 
CFHTTPCookieStorageDeleteAllCookies(storage); 
CFHTTPCookieStorageSyncStorageNow(storage); 
+0

我填寫了rdar:// 13293418([openradar](http://openradar.appspot.com/radar?id=2776403))要求公開此API;你可以填寫一個副本給它一些重量。 – Kemenaran 2013-02-26 10:06:11

10

的問題似乎是, Cookie被緩存,並不立即保存到文件中。

我做了一個sample project重現此問題 - 並發現,當應用程序接收到一個SIGKILL信號,當調試從在Xcode停止像它會只發生。在我的實驗中,未處理的異常,崩潰,exit()和abort()不會導致NSHTPPCookieStorage丟失數據。因爲這看起來像一個純調試問題(它只發生在使用調試器時),所以我關閉了之前填充的 radar

雖然我無法測試所有內容:請隨時使用示例項目來查看其他崩潰源是否會觸發Cookie丟失。

+2

非常感謝你@Kemenaran,我完全迷失了。要測試cookie,請不要從Xcode中殺死應用程序,並在從Xcode啓動此應用程序之前從手機中殺死應用程序。 – 2014-02-06 06:07:54

+0

謝謝,多數民衆贊成它。對於OSX:而不是停止使用Xcode的應用程序只需退出它(右鍵點擊應用程序圖標)。這確保了cookie被保存 – sust86 2015-06-24 13:07:38