質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

2292閲覧

URLSessionDownloadの仕組みとswiftでのzipファイルの操作に関して

takuya0501

総合スコア12

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

1グッド

1クリップ

投稿2017/09/19 10:27

#行いたいこと
前提: サーバー上にzipファイルが用意されているとする。
またそのzipファイルにはjson形式で記述された拡張子が「.json」のファイルが数個存在するものとする。
ライブラリ等は使用しないものとする。

1. URLSessionDownloadを用いてサーバー上のzipファイルのダウンロードを行う
2. ダウンロードしたzipを解凍する
3. 2で解凍したの中身の「.json」ファイルのファイル名を取得する
4. 取得したファイル名でRealmのテーブルにjsonデータを突っ込む

http://joyplot.com/documents/2016/09/30/swift-urlsession-progressbar/】
というのを行いたいのですが1の時点でうまくいきません。
上記のURLSessionDownloadの使用例を参考に実際に使用するURLを書き換え、実行してみたのですが、
ダウンロードされていたのはzipファイルではなく「.tmp」という拡張子のファイルのみで、それに関しての知識がネット上で探せなかったため質問いたしました。

#知りたいこと
い. URLSessionDownloadを用いてサーバー上のzipファイルのダウンロードした際に「.tmp」という拡張子のファイルが生成される理由もとい仕組み
ろ. URLSessionでダウンロードしたファイルの初期のPath
は. ライブラリを用いずにzipファイルの解凍する方法、またその参考になるサイト等

以上になります。ソースなどがなく見づらいかと思いますがどなたかよろしくお願いいたします。

Nishi-S👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 06:59

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuya0501

2017/09/21 10:56

ありがとうございます、非常にわかりやすく何とか期待した動作を実現できました ドキュメントをもう一度の見直してみようと思います 本当に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問