programing

앱 종료시 NSHTTPCookieStorage 상태가 저장되지 않습니다.

nicescript 2021. 1. 16. 09:18
반응형

앱 종료시 NSHTTPCookieStorage 상태가 저장되지 않습니다. 확실한 지식 / 문서가 있습니까?


이 문제로 고생하고 맞춤형 쿠키 관리 시스템을 구현하는 것을 싫어합니다.

iOS의 HTTP 구현의 일부 숨겨진 수준이 세션리스 쿠키를 제대로 관리하지 못하는 것으로 보입니다. HTTP 응답이 쿠키를 설정하거나 삭제할 때마다 NSHTTPCookieStorage 쿠키를 즉시 검사하면 예상 결과가 나오고 올바른 sessionOnly 값이 표시됩니다.

그러나 응답이 쿠키를 업데이트 한 후 곧 앱이 종료되면 해당 sessionOnly = FALSE 쿠키가 다시 실행되면 이전 상태로 되돌아 가고 가장 최근 업데이트가 손실됩니다.

쿠키가 응답 헤더 또는 NSHTTPCookieStorage setCookie :에 의해 설정 / 삭제되는지 여부는 차이가 없습니다.

일부 캐싱 / 동기화 부두는 배후에서 진행되어야합니다. 쿠키가 지속되는 데 걸리는 시간은 최대 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 앱을 다시 열 때 사용할 수 있습니까?

iPhone : NSHTTPCookie는 앱을 다시 시작할 때 저장되지 않습니다.

NSHTTPCookies 삭제 거부

앱이 종료되면 삭제 된 NSHTTPCookie가 반환됩니다.


대답은 귀하의 질문에 연결된 SO 게시물 중 하나있다고 생각합니다 .

이 문제를 재현하기 위해 샘플 프로젝트를 만들었습니다. Xcode 내에서 디버거가 중지 될 때와 같이 앱이 SIGKILL 신호를 수신 할 때만 발생한다는 것을 발견했습니다. 내 실험에서 처리되지 않은 예외, 충돌, exit () 및 abort ()로 인해 NSHTPPCookieStorage가 데이터를 잃지 않습니다.

이것은 디버깅 전용 문제처럼 보이므로 (디버거를 사용할 때만 발생 함) 이전에 채운 레이더를 닫았습니다.

전화기를 정상적으로 다시 시작하고 NSHTTPCookieStorage에 대한 모든 변경 사항이 올바르게 유지되고 다시로드되는지 관찰하여이를 테스트 할 수 있습니다.


나는 또한 같은 문제가 있지만 해결책을 찾았습니다. 브라우저에서 생성 된 쿠키를 저장 한 다음 앱이 다시 시작될 때 다시 생성합니다.

1) uiwebview에서 쿠키가 생성되면 저장합니다.

 NSMutableArray *cookieArray = [[NSMutableArray alloc] init];
    for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
        [cookieArray addObject:cookie.name];
        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
        [cookieProperties setObject:cookie.name forKey:NSHTTPCookieName];
        [cookieProperties setObject:cookie.value forKey:NSHTTPCookieValue];
        [cookieProperties setObject:cookie.domain forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:cookie.path forKey:NSHTTPCookiePath];
        [cookieProperties setObject:[NSNumber numberWithInt:cookie.version] forKey:NSHTTPCookieVersion];

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        [[NSUserDefaults standardUserDefaults] setValue:cookieProperties forKey:cookie.name];
        [[NSUserDefaults standardUserDefaults] synchronize];

    }

    [[NSUserDefaults standardUserDefaults] setValue:cookieArray forKey:@"cookieArray"];
    [[NSUserDefaults standardUserDefaults] synchronize];

2) 이제 앱이 다시 시작될 때 다시 만듭니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSMutableArray* cookieDictionary = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookieArray"];
     NSLog(@"cookie dictionary found is %@",cookieDictionary);

    for (int i=0; i < cookieDictionary.count; i++) 
{


        NSLog(@"cookie found is %@",[cookieDictionary objectAtIndex:i]);
        NSMutableDictionary* cookieDictionary1 = [[NSUserDefaults standardUserDefaults] valueForKey:[cookieDictionary objectAtIndex:i]];
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDictionary1];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];


 }

    // other code

}

감사


Sounds like an underlying NSUserDefaults-style "synchronize" call is required. I think your best shot is managing all your app's cookies separately in the standard NSUserDefaults and synching any missing ones into the NSHTTPCookieStorage's at startup. Or see if there's some private synchronize method if you're feeling brave :)

ReferenceURL : https://stackoverflow.com/questions/5837702/nshttpcookiestorage-state-not-saved-on-app-exit-any-definitive-knowledge-docume

반응형