【Swift・Objective-C】SSZipArchiveでzipの解凍・圧縮

#使用ライブラリ
今回は**SSZipArchive**というライブラリを使用して、Zipファイルの解凍・圧縮処理を行っていきます。
以下SSZipArchiveのgithubになります。
https://github.com/ZipArchive/ZipArchive

#zipの解凍
zipの解凍は解凍するZIPファイルのパスと解凍したファイルを展開するディレクトリのパスを指定する事で解凍をすることができます。

**Objective-C**

```objective_c
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのパス";
BOOL isSuccess = [SSZipArchive unzipFileAtPath:zipFilePath Destination:destinationPath];

if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}
```
**Swift**

```swift
var zipFilePath = "解凍するZIPファイルのパス"
var destinationPath = "解凍したファイルを展開するディレクトリのパス"
var isSuccess = SSZipArchive.unzipFileAtPath(zipFilePath, toDestination: destinationPath)
if (isSucces) {
  //処理が成功した場合
} else {
  //処理が失敗した場合
}
```

#パスワードzipの解凍
基本的にはzipの解凍と一緒ですが、パスワードzipの解凍ではデリゲートを使用するので注意が必要です。
もし以下のコードの処理で解凍に失敗した場合errorの処理が実行され、成功した場合はzipArchiveDidUnzipArchiveAtPathの処理が実行されます。ここで一つ注意なのが、zipArchiveDidUnzipArchiveAtPathはSSZipArchiveDelegateを親クラスに設定しないと使用できないので気をつけてください。

**Objective-C**

```objective_c
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのパス";
NSString *password = @"パスワード";
NSError *error = nil;
[SSZipArchive unzipFileAtPath:zipFilePath toDestination:destinationPath
                    overwrite:YES password:password error:&error delegate:self];
if (error) {
    //解凍処理が失敗した場合の処理
    NSLog(@"error: %@", error);
}
//下記の関数を使用する為にSSZipArchiveDelegateを親クラスに設定する必要あり
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
    //解凍処理が成功した場合
    NSLog(@"解凍完了");
}
```

**Swift**

```swift
var zipFilePath = "解凍するZIPファイルのパス"
var destinationPath = "解凍したファイルを展開するディレクトリのパス"
var password = "パスワード"
var error: Error? = nil
SSZipArchive.unzipFileAtPath(zipFilePath, toDestination: destinationPath, overwrite: true, password: password, error: &error, delegate: self)

if error != nil {
    //解凍処理が失敗した場合の処理
    print("error: \(error)")
}

//下記の関数を使用する為にSSZipArchiveDelegateを親クラスに設定する必要あり
 func zipArchiveDidUnzipArchiveAtPath(path: String!, zipInfo: unz_global_info, unzippedPath: String!) {
        //解凍処理が成功した場合の処理
        print("解凍完了！");
    }
    
```

#zipの圧縮
圧縮したzipファイルの保存先のパスと圧縮するファイルの指定をする事で、下記のコードでzipの圧縮が可能になります。

**Objective-C**

```objective_c
NSString *zippedFilePath = @"圧縮したZIPファイルの保存先パス";

//圧縮するファイルの指定
NSArray *inputFilePaths = @[[[NSBundle mainBundle]
                             pathForResource:@"sampleImage" ofType:@"jpg"],
                            [[NSBundle mainBundle]
                             pathForResource:@"sampleText" ofType:@"txt"]];
BOOL isSuccess = [SSZipArchive createZipFileAtPath:zippedFilePath withFilesAtPaths:inputFilePaths];
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}
```

**Swift**

```swift
let zippedFilePath = "圧縮したZIPファイルの保存先パス";

//圧縮するファイルの指定
let inputFilePaths = [NSBundle.mainBundle().pathForResource("sampleImage", ofType: "jpg"),
    NSBundle.mainBundle().pathForResource("sampleText", ofType: "txt")];
let isSuccess = SSZipArchive.createZipFileAtPath(zippedFilePath, withFilesAtPaths: inputFilePaths);
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}
```

#参考
使用ライブラリGitHub
https://github.com/ZipArchive/ZipArchive

記事
https://qiita.com/asakahara/items/cf68f87be4f1dd116778
http://swift-salaryman.com/ssziparchive.php
https://www.flatcorp.jp/blog/memo/299.html