私は、サーバーがユーザを識別するためのクッキーを私に渡すアプリケーションを開発しています。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];
}
}
新しいリクエストに応じて、クッキーを保存するために使用しているコードを更新してください。あなたの説明は十分ではありません。 –
テスト中に新しいセッション間でストレージからCookieを読み込んでいないため、問題が表示されませんでした。 –