Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

iOSでZIPファイルの圧縮/解凍を簡単に実装する方法

More than 5 years have passed since last update.

概要

iOSで手っ取り早くZIPファイルの圧縮/解凍する方法を調べてみました。

zlibを使ってC言語で処理を書くなんてこともできるようですが、
Objective-c 一辺倒の私にはこの方法は却下です。

ZipArchiveというライブラリもありますが、こちらはソースコードが古くARCにも対応していません。
で最終的に行き着いたのがSSZipArchiveというライブラリです。
これはZipArchiveをベースに作られたものでARCにも対応しています。

使い方もとてもシンプルだったのでSSZipArchiveが現時点(2013/12/8)では一番よいかと思います。

使い方

まずgithubからソースを取得しましょう。

https://github.com/soffes/ssziparchive

ソースコード内のSSZipArchiveディレクトリとその配下にあるminizipディレクトリをプロジェクトに追加します。

libz.dylibをターゲットに追加します。

SSZipArchive.hヘッダーをインポートすることも忘れないように。

解凍するとき

// 解凍
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのス";
BOOL isSuccess = [SSZipArchive unzipFileAtPath:zipFilePath Destination:destinationPath delegate:self];
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}

パスワードを指定する場合

// 解凍
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);
}

解凍が完了した場合に処理を実行した場合はデリゲートを設定した上で、下記メソッドを実装する

- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
    NSLog(@"解凍完了");
}

圧縮する時

// 圧縮
NSString *zippedFilePath = @"圧縮したZIPファイルの保存先パス";
NSArray *inputFilePaths = @[[[NSBundle mainBundle]
                             pathForResource:@"sampleImage" ofType:@"jpg"],
                            [[NSBundle mainBundle]
                             pathForResource:@"sampleText" ofType:@"txt"]];
BOOL isSuccess = [SSZipArchive createZipFileAtPath:zippedFilePath hFilesAtPaths:inputFilePaths];
if (isSuccess) {
    // 処理が成功した場合
} else {
    // 処理が失敗した場合
}

という事でとても簡単に実装できます。
デリゲートでは無くブロック構文に対応させてもよさそうです。

お試しあれ!

asakahara
仕事でも趣味でもアプリ作ってます。 最近はこちらのアプリを中心に開発しています。 https://mocology.com/ja/milktime/
http://sakahara.hatenablog.jp
sonicmoov
ソニックムーブは最先端のテクノロジーと サービス運用から得たデータで、 企業の『課題解決』『資産の最大化』『新規事業創出』を 支援するR&Dスタジオです。
https://www.sonicmoov.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away