サーバーがユーザーを識別するためのCookieを私に渡すアプリケーションを開発しています。
連続するリクエストには、ユーザーが期待する応答を得るには、そのCookieが必要です。私が理解できないのは、NSHTTPCookieStorageの共有インスタンスがいつどのようにCookieを失うかです。
私が使用した最初の解決策は、アプリケーションの終了時にサーバーからユーザーのデフォルトにCookieをアーカイブして保存し、アプリケーションの起動時にサーバーから既存のCookieをクリアして、保存したCookieをリセットすることです。デバッグのセッションは非常に短く、通常はアプリをバックグラウンドに置く必要がなかったため、開発プロセスを通じて問題は発生しませんでした。
ベータテスト中に、トラブルが発生しました。私がやってきたハックは、アプリケーションの終了時だけでなく、これらのCookieを返すAPI呼び出しの後でCookieを保存することです。また、保存されたCookieは、アプリの起動時だけでなく、アプリがフォアグラウンドに戻ったときにも読み込まれます。
NSHTTPCookieStorage共有インスタンスがこれらのCookieを削除する理由と、それを処理するためのベストプラクティスは、アプリの重要な部分であり、経験豊富な開発者によってバックアップされない限り、このようなハッキングされたソリューションを信頼することはできません。
よろしくお願いします
編集: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];
}
}