web-dev-qa-db-ja.com

NSURLRequestがデータをキャッシュしないようにしたり、リクエスト後にキャッシュされたデータを削除したりすることは可能ですか?

IPhoneでは、NSURLRequestを使用してデータのチャンクに対してHTTPリクエストを実行します。オブジェクトの割り当てが急増し、それに応じてデータを割り当てます。データを使い終えたら、それに応じてデータを解放します-ただし、データが解放されたことを示す機器は表示されません!

私の理論では、デフォルトでHTTPリクエストはキャッシュされますが、iPhoneアプリにこのデータをキャッシュさせたくありません。

リクエスト後にこのキャッシュをクリアする方法や、そもそもデータがキャッシュされないようにする方法はありますか?

私は以下のように少し文書化されたすべてのキャッシュポリシーを使用してみました:

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

しかし、何もメモリを解放しないようです!

86
Nick Cartwright

通常、このようなリクエストを作成する方が簡単です

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;
}
154
tcurdt

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

私はそれが誰かのために働くことを願っています:)

12
user186215

NSURLConnectionを使用する場合、デリゲートを見てください。

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

戻り値

キャッシュに保存する実際のキャッシュされた応答。デリゲートは、変更されていないcachedResponseを返すか、変更されたキャッシュされた応答を返すか、接続に対してキャッシュされた応答を保存する必要がない場合はnilを返します。

10
catlan

NSURLSessionを使用している場合、アプリのCachesディレクトリ内にiOSが作成するCache.dbにリクエストとパラメーターが書き込まれないようにする別のソリューションは、セッションの構成のNSURLCache0サイズのメモリと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 Loadingメカニズムからの応答データのキャッシュを保持する方法があることを誰かが知っている場合、知りたいと思います。 (これに関するAPIまたは公式文書はありません)

8

単一のリクエストに固有でない場合(アプリ全体のキャッシュを無効にする必要がある場合)は、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];
7
Sanjeev Rao
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

サーバーが正しく実装されていると仮定すると、Cache-Control:no-storeヘッダーをリクエストに含めると、同じヘッダーを持つサーバー応答が生成され、NSURLCacheが応答データをディスクに保存しなくなります。

したがって、NSURLCacheディスクキャッシュを無効にするショットガンアプローチは不要です。

PS:ヘッダーの追加は、AFNetworkingなどのすべてのHTTPフレームワークで機能するはずです

0
Yuri Brigance