Table of Contents
iOSアプリ内でZIPアーカイブの解凍・圧縮を行うには、ライブラリを導入するのが最も簡単な方法です。
今回は、SSZipArchive というライブラリの導入と、それを使ったzipの解凍と圧縮を行う方法について紹介します。
他にもzipを扱うライブラリはいくつかありますが、Swift3に対応済みで使いやすいライブラリである SSZipArchive を選びました。
CocoaPods で SSZipArchive をインストール
インストールは CocoaPods で行うと楽です。手順はこちらの記事で記載したものと同じです。
Podfile に以下の行を追加し、コマンド pod install を実行してください。
# Uncomment this line to define a global platform for your project # platform :ios, '9.0' target 'ProjectName' do # Comment this line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for ProjectName pod 'SSZipArchive' end
コマンド実行後にできる、.xcworkspace を Xcode で開いてください。その後、TARGET > General > Linked Frameworks and Libraries に SSZipArchive.framework を追加します。
コードを編集していきます。
ZIPを解凍するサンプルコード
アプリのDocumentディレクトリにあるzipを解凍するサンプルです。SSZipArchive を import することを忘れないでください。
import UIKit import SSZipArchive class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, .userDomainMask, true).last! let zipFilePath = "\(documentDirPath)/file.zip" // Documentsディレクトリにあるzipファイルを同ディレクトリに解凍 if !SSZipArchive.unzipFile(atPath: zipFilePath, toDestination: documentDirPath) { print("解凍できませんでした") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
ZIPの解凍には以下のメソッドを使います。
unzipFile(atPath path: String, toDestination destination: String) -> Bool
第1引数にZIPファイルのパスを、第2引数に解凍先を指定します。解凍に失敗すると false が返ってくるので、その時はログを表示するようにしています。
ZIPで圧縮するサンプルコード
複数のファイルを指定してZIPで圧縮するサンプルコードです。
Documentディレクトリに複数の画像ファイルがあるとします。
これらを圧縮するコードは以下のようになります。
import UIKit import SSZipArchive class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, .userDomainMask, true).last! // 圧縮するすべてのファイルのパスを配列に格納 let targetFilePaths = [ "\(documentDirPath)/1.jpg", "\(documentDirPath)/2.jpg", "\(documentDirPath)/3.png", ] if !SSZipArchive.createZipFile(atPath: "\(documentDirPath)/test.zip", withFilesAtPaths: targetFilePaths) { print("圧縮できませんでした") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
これで、3つの画像が test.zip にまとめて圧縮されます。
圧縮する際は以下のメソッドを使います。
createZipFile(atPath path: String, withFilesAtPaths paths: [Any]) -> Bool
第1引数に作成するZIPファイルのパスを、第2引数に圧縮したいファイル名を格納した配列を指定します。解凍のときと同様に、圧縮に失敗すると false が返ってくるので、それに応じた処理を行うことができます。
フォルダごと圧縮したり、パスワード付きのZIPで圧縮したりできるメソッドも用意されています。
以上、ZIPの解凍・圧縮を行うライブラリの導入と簡単なサンプルでした。