요청 후 NSURLREQUEST가 데이터를 캐싱하거나 캐시 된 데이터를 제거하는 것을 방지 할 수 있습니까?
-
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