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
디렉토리의 설정하는 것입니다 NSURLCache
A와 세션의 구성을 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