iOS アプリで「Zip ファイルをダウンロード→Zip 展開→展開されたファイルをアプリ内で使用」までを試す

はじめに

https://daisuke-t-jp.hatenablog.com/entry/2019/08/19/162337 で Zip アーカイブの展開(UnZip)の方法を書いたので、これを発展させて

  1. Zip をサーバからダウンロード
  2. アプリ内で Zip を展開
  3. 展開したデータをアプリで使用

というユースケースを試したので、それについて記録する。

リポジトリ

実際にアプリを実行して試せるプロジェクトは 以下の GitHub リポジトリにある。

このアプリの流れは以下である。

  1. Download ボタンをタッチする
  2. GitHub リポジトリにある Zip ファイルをダウンロードする
  3. SSZipArchive で Zip を展開する
  4. 展開したフォルダの中にある画像(melon.png, lemon.png)を UIImageView に貼り付け

ポイント

全体的にリポジトリで確認できるが、重要そうなポイントをいくつか抜粋する。

ダウンロードの開始

ファイルのダウンロードは URLSessionDownloadTask で実現した。

ダウンロード開始までの流れは以下になる。

  1. URLSessionConfiguration でセッション構成を設定する
  2. URLSessionConfiguration を元に URLSession を作成する
  3. URLSession から URLSessionDownloadTask を取得し、ダウンロードを開始する。

ダウンロード開始後の流れ

  1. URLSessionDownloadDelegate の urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) メソッドでダウンロードの進捗がデリゲートに通知される。
    • ??% 完了のような表示に使用できるデータが得られる
  2. URLSessionDownloadDelegate の urlSession(_:downloadTask:didFinishDownloadingTo:) メソッドでダウンロードの完了がデリゲートに通知される。
    • ダウンロード先のパスが引数にくるので、このタイミングでファイルに対しての操作(Zip の展開など)ができる
  3. URLSessionTaskDelegate の urlSession(_:task:didCompleteWithError:) メソッドでセッションタスクの完了がデリゲートに通知される。

URLSession で扱えるプロトコル

おわり

そのほか

  • Objective-C だと NSURLSession だが Swift だと NS がなく URLSession であることに気をつけたい
    • 時代の流れを感じる
  • ちなみにアップロードの場合はこちらを使用する → URLSessionUploadTask

以上