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];
デリゲートでconnection:willCacheResponse:メソッドを実装します。単にnilを返すだけでそれができます。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
他のヒント
Twitterから情報をリクエストしたときに、アプリに同じ問題があります。私の場合、これらの資格情報を保持する必要はなかったので、次のコードを使用して単純にそれらを消去します。
- (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を返します。
単一のリクエストに固有でない場合(アプリ全体のキャッシュを無効にする必要がある場合)は、1つ以下が最適なオプションです。
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
を使用している場合、リクエストとパラメーターがiOSの Cache.db
に書き込まれないようにする別のソリューションは、アプリの Cache
ディレクトリ、セッションの構成の 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がiOSのディスクへの書き込みを停止しますが、 reloadIgnoringLocalCacheData
のポリシーがある場合は、おそらくメモリキャッシングにも関心がないでしょう。
注これにより、 Caches / Cache.db
(リクエストと応答)または Caches / fsCachedData /
フォルダー(応答データ)が防止されます。まったく作成されています。リクエストをディスクキャッシュに保存したくないので、セキュリティの目的でアプリでこのアプローチを採用することにしました。
リクエストのキャッシュのみを停止し、iOS URL Loadingメカニズムからの応答データのキャッシュを保持する方法があることを誰かが知っている場合、知りたいと思います。 (私が伝えることができるものから、これに関するAPIまたは公式文書はありません)
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
サーバーが正しく実装されていると仮定すると、 Cache-Control:no-store
ヘッダーをリクエストに含めると、同じヘッダーを持つサーバー応答が生成されるため、 NSURLCache
応答データをディスクに保存しないようにします。
したがって、 NSURLCache
ディスクキャッシュを無効にするショットガンアプローチは不要です。
PS: AFNetworking