BLOG

Blitz Gateスタッフブログ

BLOG

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

書いた人:

iOS , iPhone , Swift , 技術 , 開発言語  

FileDownload

どうも、ゆんゆんです。
 
一気に寒くなってきて風邪ひきそうです。
 
今回は、先日iPhoneアプリでファイルダウンロードをしようとした際に
嵌ってしまった話をしようと思います。
 

開発環境

 
今回の開発環境は下記のとおりです。
 
Xcode: 8.0
Swift: 3
iOS: 9以上
 

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

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

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 キャッシュを使用しない 必要があります。
 

let sessionConf = URLSessionConfiguration.default
sessionConf.requestCachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData
let session = URLSession(configuration: sessionConf)

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


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

  • このエントリーをはてなブックマークに追加