요청 후 NSURLREQUEST가 데이터를 캐싱하거나 캐시 된 데이터를 제거하는 것을 방지 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/405151

  •  03-07-2019
  •  | 
  •  

문제

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];

연결을 구현하십시오 : 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를 수정하지 않고 반환하거나 수정 된 캐시 응답을 반환하거나 연결에 대해 캐시 된 응답이 저장되지 않으면 반환 할 수 있습니다.

단일 요청에만 국한되지 않은 경우 (전체 앱에 대한 캐시 비활성화) 아래는 최상의 옵션입니다.

        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];

사용하는 경우 NSURLSession, 요청 및 매개 변수를 Cache.db iOS는 앱 내에서 생성됩니다 Caches 디렉토리는 다음과 같습니다 NSURLCache 세션의 구성을 위해 0 크기 메모리와 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)

아마도 디스크 크기의 0 일 것입니다. reloadIgnoringLocalCacheData 그렇다면 아마도 메모리 캐싱에 관심이 없을 것입니다.

메모 이것은 어떤 것도 방해 할 것입니다 Caches/Cache.db (요청 및 응답) 또는 Caches/fsCachedData/ 폴더 (응답 데이터)가 전혀 생성됩니다. 우리는 디스크 캐시에 요청을 저장하기를 원하지 않기 때문에 보안 목적으로 앱 에서이 접근 방식을 취하기로 결정했습니다.

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

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

서버가 올바르게 구현되었다고 가정하면 Cache-Control:no-store 요청의 헤더는 동일한 헤더로 서버 응답을 생성하므로 NSURLCache 응답 데이터를 디스크에 저장하지 않으려면

따라서 장애의 산탄 총 접근이 필요하지 않습니다. NSURLCache 디스크 캐싱.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top