10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iosはレスポンスをキャッシュする?

Last updated at Posted at 2018-04-24

#経緯

使用ライブラリ: Alamofire

ある日、アプリとサーバーでやり取りしている最中に発生しました。

送ったリクエストに対して、レスポンスが返ってくるときに前に送ったときのレスポンスがそのまま返ってきたのです。

ヘッダーの情報は変わっているのにです。

サーバー側は正常なレスポンスを返しており、かつiosのアプリを起動し直すと治ります。

#原因
もともとAlamofireはNSURLSessionを元に作られているそうです。

NSURLSessionはレスポンスの結果が前回の結果と同じ場合(ヘッダー情報を含まず)はキャッシュされたレスポンスを返すそうです。

#対処方法

対処法1:キャッシュポリシーを設定してキャッシュしないようにする。

キャッシュポリシーを設定することによって、ローカルキャッシュの使用方法を指定します。

キャッシュポリシー 説明
URLRequestUseProtocolCachePolicy デフォルトのキャッシュポリシーです。プロトコルに最も準拠したポリシーとして定義されます。
URLRequestReloadIgnoringCacheData URLローディングシステムは送信元からデータを読み込み、キャッシュは完全に無視されます。
URLRequestReturnCacheDataElseLoad キャッシュデータが存在する場合、URLローディングシステムは有効期間や有効期限を無視してキャッシュデータを使用し、キャッシュバージョンがない場合にのみ、送信元からデータを読み込みます。
URLRequestReturnCacheDataDontLoad アプリケーションは、キャッシュ内のデータのみが返されるように指定できます。レスポンスがローカルキャッシュ内にない場合に、このキャッシュポリシーを使用してNSURLSessionTaskインスタンスを作成しようとすると、すぐにnilが返されます。

URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 5)

対処法2: キャッシュをクリアする

URLCache.shared.removeAllCachedResponses()

このコードを使用するとキャッシュを全て削除してくれます。

以上です。
間違えている箇所がございましたらご指摘お願いします。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?