はじめに
https://daisuke-t-jp.hatenablog.com/entry/2019/08/19/162337 で Zip アーカイブの展開(UnZip)の方法を書いたので、これを発展させて
- Zip をサーバからダウンロード
- アプリ内で Zip を展開
- 展開したデータをアプリで使用
というユースケースを試したので、それについて記録する。
リポジトリ
実際にアプリを実行して試せるプロジェクトは 以下の GitHub リポジトリにある。
このアプリの流れは以下である。
- Download ボタンをタッチする
- GitHub リポジトリにある Zip ファイルをダウンロードする
- SSZipArchive で Zip を展開する
- 展開したフォルダの中にある画像(melon.png, lemon.png)を UIImageView に貼り付け
ポイント
全体的にリポジトリで確認できるが、重要そうなポイントをいくつか抜粋する。
ダウンロードの開始
ファイルのダウンロードは URLSessionDownloadTask で実現した。
ダウンロード開始までの流れは以下になる。
- URLSessionConfiguration でセッション構成を設定する
- キャッシュの扱いやタイムアウト、など色々設定できる
- URLSessionConfiguration を元に URLSession を作成する
- URLSession から URLSessionDownloadTask を取得し、ダウンロードを開始する。
ダウンロード開始後の流れ
- URLSessionDownloadDelegate の urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)
メソッドでダウンロードの進捗がデリゲートに通知される。
- ??% 完了のような表示に使用できるデータが得られる
- URLSessionDownloadDelegate の urlSession(_:downloadTask:didFinishDownloadingTo:) メソッドでダウンロードの完了がデリゲートに通知される。
- ダウンロード先のパスが引数にくるので、このタイミングでファイルに対しての操作(Zip の展開など)ができる
- URLSessionTaskDelegate の urlSession(_:task:didCompleteWithError:) メソッドでセッションタスクの完了がデリゲートに通知される。
- このタイミングで URLSession の finishTasksAndInvalidate() をコールし、タスクを終了・無効化させる。
URLSession で扱えるプロトコル
おわり
そのほか
- Objective-C だと NSURLSession だが Swift だと NS がなく URLSession であることに気をつけたい
- 時代の流れを感じる
- ちなみにアップロードの場合はこちらを使用する → URLSessionUploadTask
以上