APIドキュメントを読み、さらにコードを書いて実行してみれば色々理解出来ます。
swift
1 func downloadZip() {
2 let config = URLSessionConfiguration.background(withIdentifier: "download-zip")
3 let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
4 let url = URL(string: "(zipファイルのURL)")!
5 let task = session.downloadTask(with: url)
6 print("ダウンロード開始")
7 task.resume()
8 }
9
10 // URLSessionDownloadDelegateを実装する
11
12 func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
13 didFinishDownloadingTo location: URL) {
14 // ダウンロード完了
15 print("ダウンロードした一時ファイルはここ:\(location)")
16 // 一時ファイルを Library/Caches/my.zip にリネームしておく場合
17 let fileManager = FileManager.default
18 let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
19 let targetURL = URL(fileURLWithPath: path + "/my.zip")
20 try? fileManager.removeItem(at: targetURL)
21 try? fileManager.moveItem(at: location, to: targetURL)
22 }
23
24 func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
25 didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
26 totalBytesExpectedToWrite: Int64) {
27 print("進捗:\(totalBytesWritten)/\(totalBytesExpectedToWrite)")
28 }
29
30 func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
31 if let err = error {
32 print("エラー起きたときの処理が必要。原因は\(err)")
33 }
34 }
35
「ダウンロードした一時ファイルはここ」のログはこんな感じでした。(部分的に省略しています)
ダウンロードした一時ファイルはここ:file:///private/var/mobile/Containers/Data/Application/(省略)/Library/Caches/com.apple.nsurlsessiond/Downloads/(省略)/CFNetworkDownload_ng32Aj.tmp
い. URLSessionDownloadを用いてサーバー上のzipファイルのダウンロードした際に「.tmp」という拡張子のファイルが生成される理由もとい仕組み
urlSession(_:downloadTask:didFinishDownloadingTo:) のlocationの説明で「一時ファイルだ」と説明があります。一時ファイルですから拡張子とか気にする必要はありません。
確実にzipファイルであるはずのURLを使ってダウンロードして成功したのであれば、それはファイル名がどうなっていてもzipファイルのはずです。locationの説明ではさらに「読み込んで使うかリネームしろ」と指示があります。
バイナリレベルでzipかどうか確認したいということでしたら、実行中にデバッガで止めて、Devices でアプリをダウンロードすれば、実機であってもその時点での一時ファイルを眺めることが可能です。
ろ. URLSessionでダウンロードしたファイルの初期のPath
上のログを見ると Library/Caches が使われているようですが、一時ファイルですからそれを前提にするのは良くないです。
は. ライブラリを用いずにzipファイルの解凍する方法、またその参考になるサイト等
私はライブラリを使っているので分かりませんが、どうしてもライブラリを使いたくないのであれば、サーバ側で展開してしまうのも手だと思いました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/21 10:56