2012-07-19 13 views
12

Ich entwickle eine Anwendung, wo der Server mir einen Cookie übergibt, um den Benutzer zu identifizieren.Gemeinsame Instanz von NSHTTPCookieStorage speichert keine Cookies

Meine aufeinanderfolgenden Anforderungen müssen diesen Cookie haben, um die Antwort zu haben, die der Benutzer erwartet. Was ich nicht verstehen kann ist, wie und wann die gemeinsame Instanz von NSHTTPCookieStorage seine Cookies verliert.

Die erste Lösung, die ich verwendet habe, ist zu archivieren und speichern Sie die Cookies von meinem Server auf Benutzer Standardeinstellungen für Anwendungen, dann löschen Sie vorhandene von meinem Server beim Start der Anwendung und setzen Sie die, die ich gespeichert habe. Durch den Entwicklungsprozess hatte ich keine Probleme, da die Sitzungen zum Debuggen sehr kurz sind und die App normalerweise nicht in den Hintergrund stellen musste.

Während der Beta-Tests begannen die Probleme. Der Hack, mit dem ich kam, ist, die Cookies nicht nur bei der Beendigung der Anwendung zu speichern, sondern auch nach den API-Calls, die mir diese Cookies zurückgeben. Und um die gespeicherten Cookies nicht nur beim Start der App zu laden, sondern auch, wenn die App in den Vordergrund zurückkehrt.

Wie wird die NSHTTPCookieStorage Freigabe Instanz diese Cookies loswerden und was ist die beste Praxis, um damit umzugehen, wie es ein wichtiger Teil meiner App ist und ich kann nicht so eine gehackte Lösung vertrauen, wenn nicht von erfahrenen Entwicklern gesichert .

Vielen Dank im Voraus für Ihre Antworten

EDIT: Hier sind die Methoden/speichern cookies

-(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

Bitte aktualisieren Sie mit dem Code, den Sie verwenden, um die Cookies nach einer neuen Anfrage aus dem Cookie-Speicher zu entfernen. Ihre Beschreibung ist nicht ausreichend. –

+0

Sie haben kein Problem festgestellt, weil Sie die Cookies während des Tests zwischen den neuen Sitzungen nicht aus dem Speicher geladen haben. –

Antwort

-1

Gelöst!

Nach einigem einfachen Debugging fand ich heraus, dass das Problem mit der URL war, die ich in cookiesForURL: verwendete. Ich fing einfach an, cookies Eigenschaft zu verwenden, und jetzt funktioniert es gut.

+0

Bitte aktualisieren Sie Ihren Code, ich bin in der gleichen Situation – Halid

+0

Sorry, aber ich habe keinen Zugriff auf den Code mehr. Es ist vor 4 Jahren. – Moxy

+0

@Moxy Ich brauche Hilfe dafür – Siva

18

NSHttpCookieStorage verliert seine Cookies lesen/löschen, weil Sie nicht die Ablaufzeit festgelegt haben für Cookies. Es ist notwendig, die Ablaufzeit festzulegen, sonst verlieren Ihre Cookies beim Beenden Ihrer App.

Hier ist ein kurzer Blick, wie ich während der App Ausfahrt meine Cookies gespeichert und zu starten,

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

Hoffnung, das hilft.

+0

das Ablaufdatum ist bereits vom Server – Moxy

+0

Ich habe Ihre Antwort die Prämie zugesprochen, obwohl es keine Lösung für mich ist, aber es ließ mich Dinge entdecken, die ich in meinem Code verpasst (mit der URL verwendete ich keine Cookies gespeichert) . Ich bin jetzt im Urlaub und mit meinen Surfkursen komme ich zu erschöpft nach Hause, um meinen Code zu berühren. Ich werde meine Frage bearbeiten, wenn ich etwas ändern werde. – Moxy

2

humayun könnte richtig sein -

aber Sie keine Cookies NSUserDefaults schreiben sollte -

Der ganze Sinn des sharedHTTPCookieStorage ist, dass Sie sie von dort lesen.

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

Sie sollten diese Cookies aus Sicherheitsgründen nicht einmal in NSUserDefaults schreiben können. Aber vielleicht können Sie. Wie auch immer, es ist wahrscheinlich, dass das Timeout nicht als humayun angegeben wurde.

Bitte refaktorieren Sie Ihren Code und versuchen Sie nicht, Cookies in den Benutzereinstellungen zu speichern.

+0

Aber das Problem ist, dass sie in der sharedHTTPCookieStorage nicht bestehen bleiben. Ich habe das Ablaufdatum überprüft, wenn es vom Server übergeben wurde und es ist gut eingestellt (läuft nicht vor langer Zeit ab) – Moxy

2

Ist das der Simulator? Und mit rollenden Cookies?

Im Simulator bleiben Cookies nicht wirklich so, wie sie sollten, weil sie mit Desktop Safari geteilt werden. Wenn sich die Kekse umdrehen, überschreibt man schließlich den anderen.

Dies ist kein Problem auf dem Gerät selbst, wo jede App ihren eigenen Cookie-Speicher hat.(Und, ehrlich gesagt, ich habe nicht bemerkt, dass es in Mountain Lion passiert.)

+0

Ich benutze ein echtes Gerät – Moxy

+1

Danke! Er hat mich davor bewahrt, verrückt zu werden und herauszufinden, warum Cookies nicht auf dem Simulator bleiben. –