[cocoa-touch] NSURLRequest가 데이터를 캐시하지 못하도록하거나 요청 후 캐시 된 데이터를 제거 할 수 있습니까?

iPhone에서는 데이터 청크에 대해 NSURLRequest를 사용하여 HTTP 요청을 수행합니다. 개체 할당이 급증하고 그에 따라 데이터를 할당합니다. 데이터 작업을 마치면 그에 따라 해제합니다. 그러나 기기에는 해제 된 데이터가 표시되지 않습니다!

내 이론은 기본적으로 HTTP 요청이 캐시되지만 iPhone 앱이이 데이터를 캐시하는 것을 원하지 않습니다.

요청 후이 캐시를 지우거나 데이터가 처음에 캐시되지 않도록하는 방법이 있습니까?

다음과 같이 약간 문서화 된 모든 캐시 정책을 사용해 보았습니다.

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

그러나 아무것도 기억을 비우는 것 같지 않습니다!



답변

일반적으로 다음과 같은 요청을 만드는 것이 더 쉽습니다.

NSURLRequest *request = [NSURLRequest requestWithURL:url
      cachePolicy:NSURLRequestReloadIgnoringCacheData
      timeoutInterval:60.0];

그런 다음 연결을 만듭니다.

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
       delegate:self];

대리자에서 connection : willCacheResponse : 메서드를 구현합니다. nil을 반환하면됩니다.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
  return nil;
}


답변

트위터에서 정보를 요청할 때 내 앱에서 동일한 문제가 발생합니다. 제 경우에는 해당 자격 증명을 보존 할 필요가 없었으므로 다음 코드를 사용하여 간단히 지 웁니다.

- (void) eraseCredentials{
NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [credentialsStorage allCredentials];

//iterate through all credentials to find the twitter host
for (NSURLProtectionSpace *protectionSpace in allCredentials)
    if ([[protectionSpace host] isEqualToString:@"twitter.com"]){
        //to get the twitter's credentials
        NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace];
        //iterate through twitter's credentials, and erase them all
        for (NSString *credentialKey in credentials)
            [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace];
    }
}

누군가에게 효과가 있기를 바랍니다. 🙂


답변

NSURLConnection을 사용하는 경우 대리자를 살펴보십시오.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

반환 값

캐시에 저장할 실제 캐시 된 응답입니다. 델리게이트는 수정되지 않은 cachedResponse를 반환하거나, 수정 된 캐시 된 응답을 반환하거나, 연결에 대해 캐시 된 응답을 저장해야하는 경우 nil을 반환 할 수 있습니다.


답변

당신이 사용하는 경우 NSURLSession요청을 방지하기 위해, 또 다른 솔루션과에 매개 변수가 기록되는 Cache.db아이폰 OS는 응용 프로그램의 내 생성 Caches디렉토리의 설정하는 것입니다 NSURLCacheA와 세션의 구성을 0 크기의 메모리와 공 크기의 디스크 캐시

let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)

또는 위에서 언급했듯이 전역 캐시 수준에서 설정

URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

아마도 iOS가 디스크에 쓰는 것을 중지하는 디스크 크기의 경우 0이지만 정책이 있다면 reloadIgnoringLocalCacheData아마도 메모리 캐싱에도 관심이 없을 것입니다.

참고 이렇게하면 Caches/Cache.db(요청 및 응답) 또는 Caches/fsCachedData/폴더 (응답 데이터)가 전혀 생성되지 않습니다. 우리는 요청이 디스크 캐시에 저장되는 것을 원하지 않으므로 보안 목적으로 앱에서이 접근 방식을 사용하기로 결정했습니다.

요청 캐싱 만 중지하고 iOS URL로드 메커니즘에서 응답 데이터 캐싱을 유지하는 방법이 있다는 것을 아는 사람이 있다면 알고 싶습니다. (내가 말할 수있는 API 나 공식 문서가 없습니다)


답변

하나의 요청에 국한되지 않는 경우 (U는 전체 앱에 대해 캐시를 비활성화하려는 경우) 하나 아래에있는 것이 가장 좋습니다.이 코드를 앱 대리자에 추가하거나 필요에 따라 어디에나 추가하십시오.

        int cacheSizeMemory = 0*4*1024*1024; // 0MB
        int cacheSizeDisk = 0*32*1024*1024; // 0MB
        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
        [NSURLCache setSharedURLCache:sharedCache];


답변

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

서버가 올바르게 구현되었다고 가정하고 Cache-Control:no-store요청에 헤더를 넣으면 동일한 헤더를 가진 서버 응답이 생성 NSURLCache되어 응답 데이터가 디스크에 저장되지 않습니다.

따라서 NSURLCache디스크 캐싱 을 비활성화하는 샷건 방식이 필요하지 않습니다 .

추신 : 헤더 추가는 다음과 같은 모든 HTTP 프레임 워크에서 작동합니다. AFNetworking


답변