iPhoneでファイルダウンロードの際に嵌った話
どうも、のえるです。
一気に寒くなってきて風邪ひきそうです。
今回は、先日iPhoneアプリでファイルダウンロードをしようとした際に
嵌ってしまった話をしようと思います。
開発環境
今回の開発環境は下記のとおりです。
Xcode: 8.0
Swift: 3
iOS: 9以上
ファイルダウンロードの方法
サーバーからのファイルダウンロードの情報もあまり無いので、
まずはダウンロードするプログラムを掲載してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
let url:URL = URL(string: "http://hogehoge.com/image.jpg") let task:URLSessionTask = URLSession.shared.dataTask(with: URL) { (data:Data?, response:URLResponse?, error:Error?) in if let err = error { print(err.localizedDescription) } else { guard let urlContent = data else { return } let tmpDirPath:String = NSTemporaryDirectory() let fileName:String = String("downloadImage.jpg") let savePath:URL = URL(fileURLWithPath: tmpDirPath+fileName) do { try urlContent.write(to: savePath, options: Data.WritingOptions.atomic) } catch { } } } task.resume() |
サーバーアクセスを行う場合は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 キャッシュを使用しない 必要があります。
1 2 3 |
let sessionConf = URLSessionConfiguration.default sessionConf.requestCachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData let session = URLSession(configuration: sessionConf) |
これで session にはキャッシュを使用しない設定をすることが出来ます。
あとは「URLSession.shared.dataTask」の部分を「session.dataTask」に変更してあげれば、
無事に画像2がダウンロード(上書き)されます。
いかがでしたでしょうか?
この情報を調べてみると、どこのサイト様でも「URLSessionConfigurationで
キャッシュポリシーの設定ができる」とだけしか書いて無く、
「キャッシュの破棄の方法」は載っていませんでした。
やはりこういう情報はどんどん公開していきたいと思います。
今回はここまでです。
次は何を書こうかな?
ではではっ♪
- おすすめ記事
POPULAR
のえる
Full-stack Developer