この問題に苦しんでおり、カスタムの Cookie 管理システムを実装することをためらっています。
iOS の HTTP 実装の隠れたレベルで、セッションレス Cookie を適切に管理できていないようです。HTTP 応答が Cookie を設定または削除するたびに、NSHTTPCookieStorage Cookie を即座に検査すると、期待される結果が得られ、正しい sessionOnly 値が示されます。
ただし、応答が Cookie を更新した直後にアプリが終了した場合、再起動時にそれらの sessionOnly=FALSE Cookie は以前の状態に戻り、最新の更新は失われます。
Cookie が応答ヘッダーまたは NSHTTPCookieStorage setCookie: によって設定/削除されるかどうかに違いはありません。
キャッシング/同期ブードゥーが舞台裏で行われているに違いありません。Cookie が永続的になるまでにかかる時間は、最大 5 秒です。
この行動の決定的な説明を持っている、または指摘できる人はいますか? それは単純明快なバグですか?それとも、目的が理解できない文書化されていない機能ですか?
再現に使用できるコード:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
NSHTTPCookie *cookie;
for (cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
NSLog(@"%@=%@", cookie.name, cookie.value);
}
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
// set expiration to one month from now
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
このコードは、起動するたびに新しい値を出力する必要があります。代わりに、アプリをすぐに終了しても値が変更されないことがわかります。
関連する可能性のあるスタック オーバーフローの質問:
アプリの再開時にiphone NSHTTPCookieStorageを利用できますか?