先日、Alamofireを用いてAPIのリクエストを行っていたところ、キャッシュが原因で不具合が発生していたため、その時に行った対処法をご紹介します。
##発生していた不具合
APIが一度リクエストされたあとにiPhone端末自体の時刻を過去の時間に戻したところ、以前のAPIのレスポンスが返却され、サーバのアクセスログにもログがなく、API自体がリクエストされていない。
##対処法
URLRequestのcachePolicyに.reloadIgnoringLocalCacheData
を設定することでキャッシュを無視することができました。具体的には下記のようになります。
let request = URLRequest(url: URL(string: "https://example.tetsukick.com"),
cachePolicy: .reloadIgnoringLocalCacheData,
timeoutInterval: 5.0)
##補足事項
cachePolicyには他にも下記の設定ができるようです。まだ実際に使用することはできておりませんが、ネットワークの通信状況によっては、あえてキャッシュのデータを返すようなこともできるのではと思います。
cachePolicy | 説明 |
---|---|
useProtocolCachePolicy | 特定のURLロード要求に対して、プロトコル実装で定義されているキャッシング・ロジックがあればそれを使用します。 |
reloadIgnoringLocalCacheData | ローカルに保存されたキャッシュデータを無視して取得します。 |
~~ローカルのキャッシュデータに加え、ネットワーク途中のプロキシなども含めてキャッシュを無視して取得します。~~現在、使用不可の設定値 | |
returnCacheDataElseLoad | キャッシュデータがあれば、その有効期限などは考慮せずキャッシュを使います。なければ、取得します。 |
returnCacheDataDontLoad | キャッシュデータがあれば、その有効期限などは考慮せずキャッシュを使います。なければ、失敗になります。 |
reloadRevalidatingCacheData | HEADリクエストを発行し更新を確認します、更新があればリクエストを発行します。 |
##参考資料
AlamofireでCache-Controlを設定する
[Swift] Alamofireでキャッシュを無効化してリクエストを発行する
##更新履歴
2018/07/23 tokorom様より、ご指摘いただき、reloadIgnoringLocalAndRemoteCacheData
→reloadIgnoringLocalCacheData
に変更いたしました。
下記、公式ドキュメントに記載の通り、現在実装されていないようです。
https://developer.apple.com/documentation/foundation/nsurlrequest/cachepolicy/reloadignoringlocalandremotecachedata
tokorom様ありがとうございます。