iPhoneでファイルダウンロードの際に嵌った話

のえる のえる 2016.10.31

どうも、のえるです。

一気に寒くなってきて風邪ひきそうです。

今回は、先日iPhoneアプリでファイルダウンロードをしようとした際に
嵌ってしまった話をしようと思います。

開発環境

今回の開発環境は下記のとおりです。

Xcode: 8.0
Swift: 3
iOS: 9以上

ファイルダウンロードの方法

サーバーからのファイルダウンロードの情報もあまり無いので、
まずはダウンロードするプログラムを掲載してみます。

サーバーアクセスを行う場合はATSの設定が必要です。
ATSの設定方法は コチラ のサイト様などを参考にしてください。

これで、アプリのtmpディレクトリに「downloadImage.jpg」という画像ファイルがダウンロードされてきます。
しかし、これにはちょっとした落とし穴がありました。

ファイルダウンロードの落とし穴

さて、落とし穴の話をする前に、落とし穴に至る状況を説明してみます。

[順番]
1.サーバーのファイル(画像1)をiPhoneにダウンロードする
2.サーバーのファイルを同名で変更する(画像1を画像2と入れ替える)
3.サーバーのファイル(画像2)をiPhoneにダウンロードする(ファイルを上書き)

ファイル名が同じなので、画像URLはそのままです。
(URL: http://hogehoge.com/image.jpg)

さて、1番から順番に行い、3番になったとき、tmpディレクトリの downloadImage.jpg は何の画像が表示されるでしょうか?

正解は 画像1 が表示されます。

なぜ画像2をダウンロードしているのに、画像1が表示されるのでしょうか?
上書きに失敗しているのでしょうか?

画像1が表示される理由

なぜ画像1が表示されるのか、それはWeb系の開発をしたことがある人でしたら
ある程度予想が出来るかと思います。

そうです キャッシュ です。

URLに対する画像がキャッシュされてしまっていました。
ですので、キャッシュを破棄する or キャッシュを使用しない 必要があります。

これで session にはキャッシュを使用しない設定をすることが出来ます。
あとは「URLSession.shared.dataTask」の部分を「session.dataTask」に変更してあげれば、
無事に画像2がダウンロード(上書き)されます。


いかがでしたでしょうか?

この情報を調べてみると、どこのサイト様でも「URLSessionConfigurationで
キャッシュポリシーの設定ができる」とだけしか書いて無く、
「キャッシュの破棄の方法」は載っていませんでした。
やはりこういう情報はどんどん公開していきたいと思います。

今回はここまでです。
次は何を書こうかな?

ではではっ♪

POPULAR

のえる

書いた人

のえる

Full-stack Developer / Motorcycle Enthusiast / Guitarist