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

デリゲートで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

など、すべてのHTTPフレームワークでヘッダーを追加する必要があります
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top