[Swift3.0] ZIPファイルの解凍と圧縮ができるiOSアプリ

2016年10月15日(更新: 2016年10月15日)

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

pod install SSZipArchive

コマンド実行後にできる、.xcworkspace を Xcode で開いてください。その後、TARGET > General > Linked Frameworks and LibrariesSSZipArchive.framework を追加します。

プロジェクトにSSZipArchiveライブラリを追加

コードを編集していきます。

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ディレクトリに複数の画像ファイルがあるとします。

圧縮されたできたzip

これらを圧縮するコードは以下のようになります。

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 にまとめて圧縮されます。

圧縮されたできたzip

圧縮する際は以下のメソッドを使います。

createZipFile(atPath path: String, withFilesAtPaths paths: [Any]) -> Bool

第1引数に作成するZIPファイルのパスを、第2引数に圧縮したいファイル名を格納した配列を指定します。解凍のときと同様に、圧縮に失敗すると false が返ってくるので、それに応じた処理を行うことができます。

フォルダごと圧縮したり、パスワード付きのZIPで圧縮したりできるメソッドも用意されています。

以上、ZIPの解凍・圧縮を行うライブラリの導入と簡単なサンプルでした。

コメントを残す

メールアドレスが公開されることはありません。