2012-07-19 16 views
12

私は、サーバーがユーザを識別するためのクッキーを私に渡すアプリケーションを開発しています。NSHTTPCookieStorageの共有インスタンスはクッキーを永続化しません

私の連続したリクエストには、ユーザーが期待する応答を得るためにそのクッキーが必要です。 私が理解できないのは、NSHTTPCookieStorageの共有インスタンスがいつどのようにCookieを失うかということです。

私が使った最初の解決策は、サーバーからのCookieをアーカイブしてアプリケーションの終了時にユーザーの既定値に保存し、アプリケーションの起動時にサーバーから既存のものを消去し、保存したものをリセットすることです。 開発プロセスを通じて、私はデバッグのためのセッションが非常に短く、通常はバックグラウンドでアプリケーションを置く必要はないので、問題に遭遇しませんでした。

ベータテスト中にトラブルが発生しました。 私がやってきたハックは、アプリケーションの終了時だけでなく、これらのクッキーを返すAPI呼び出しの後にクッキーを保存することです。アプリの起動時だけでなく、アプリがフォアグラウンドに戻るときにも保存されたクッキーを読み込むことができます。

どのようにNSHTTPCookieStorage共有インスタンスがこれらのクッキーを取り除き、私のアプリの重要な部分であるため、それを処理するためのベストプラクティスは何ですか?また、経験豊かな開発者によってバックアップされないと、 。有効期限を設定していなかったので、ここで はクリア/読み込み/保存する方法ですクッキー

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

新しいリクエストに応じて、クッキーを保存するために使用しているコードを更新してください。あなたの説明は十分ではありません。 –

+0

テスト中に新しいセッション間でストレージからCookieを読み込んでいないため、問題が表示されませんでした。 –

答えて

-1

解決済み!

いくつかの簡単なデバッグの後、問題は私がcookiesForURL:で使用していたURLであることがわかりました。 私は単にcookiesプロパティを使い始めましたが、今は正常に動作します。

+0

あなたのコードを更新してください、私は同じ状況になります – Halid

+0

申し訳ありませんが、コードにもうアクセスできません。 4年前からです。 – Moxy

+0

@Moxy私はこれに助けが必要です – Siva

18

NSHttpCookieStorageそのクッキーを失う:

EDITは、あなたの答えを事前にありがとうございますクッキーのため。有効期限を設定する必要があります。そうしないと、アプリの終了時に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

+0

私はあなたの答えを賞金を与えられましたが、それは私の解決策ではありませんでしたが、私のコードで逃したものを発見できました(私は、 。私は今休暇中です。私のサーフレッスンで、私は自分のコードに触れるのに疲れて帰宅します。私は何かを変えるときに私の質問を編集します。 – Moxy

2

フマユーンが正しいかもしれない -

あなたはNSUserDefaultsにクッキーを書くべきではありませんが -

sharedHTTPCookieStorageの全体のポイントは、あなたがそこからそれらを読んでいます。

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

セキュリティ上の理由から、これらのCookieをNSUserDefaultsに書き込むことはできません。 しかし、おそらく可能です。いずれにしても、時間切れがうまれているとは思われませんでした。

どちらの方法でも、あなたのコードをリファクタリングして、ユーザーの好みにクッキーを保存しないでください。

+0

しかし、問題はそれらがsharedHTTPCookieStorageに残らないということです。私はサーバーから渡された有効期限をチェックして、それがうまく設定されている(長い時間が経過する前に期限切れにならない) – Moxy

2

これはシミュレータですか?ローリングクッキーを使用して?

シミュレータでは、デスクトップのSafariと共有されているため、クッキーは本当に必要としているとおりに保持されません。クッキーがロールオーバーすると、最終的にもう一方のクッキーが上書きされます。

これは、各アプリに独自のCookieストアがあるデバイス自体には問題ありません。(そして、真実を伝えて、私はまだマウンテンライオンで起こっていることに気づいていません)

+0

私は実際のデバイスを使用しています – Moxy

+1

ありがとう!クッキーがシミュレーターに残っていない理由を知ろうと私を狂わせから救った。 –