プログラミングと音楽とアニメとiPhoneとiPadとMacとAndroidとLogicとギターとテニスと車

アプリ開発系の勉強メモやTipsなどを中心に他いろいろと書いていきます。

SSZipArchiveでパスワード付きzipファイルを扱う

iOSアプリ開発でパスワード付きのzipファイルを扱う機会があったので、
SSZipArchiveというライブラリが便利そうだったので、扱い方のメモになります。

  1. SSZipArchiveのライブラリをダウンロード
  2. ダウンロードしたライブラリをプロジェクトに追加
  3. libz.dylibを追加
  4. パスワード付きzipファイルの用意
  5. 実装の解説
  6. サンプルコード

1. SSZipArchiveのライブラリをダウンロード
GitHub - ZipArchive/ZipArchive: ZipArchive is a simple utility class for zipping and unzipping files on iOS and Mac.

2. ダウンロードしたライブラリ内のSSZipArchiveフォルダごとプロジェクトに追加
f:id:travitu:20141222234552p:plain
f:id:travitu:20141222234557p:plain
f:id:travitu:20141222235153p:plain

3. プロジェクトのTARGETS>Build Phases>Link Binary With Libraries でlibz.dylibを追加
f:id:travitu:20141222234608p:plain
f:id:travitu:20141222234609p:plain

4. パスワード付きzipファイルの用意
ここではテストでphoto1.zipというzipファイルを用意しました。
中身はphoto1.jpgという画像ファイルです。
このzipファイルをプロジェクトに追加しておきます。
f:id:travitu:20141222235842p:plain

photo1.jpg→photo1.zipへのパスワード付きzip圧縮は、Macのターミナルで以下のコマンドで行いました。
$ zip -e -r photo1.zip photo1.jpg

5. 実装
#import "SSZipArchive.h"を記述して実装していきます。

パスワード付きzipを解凍するSSZipArchiveのメソッド

// Unzip
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate;

この他にも、SSZipArchive.hでいくつかメソッドが宣言されていますが、今回はこれを利用しました。
引数の種類はこんな感じです
unzipFileAtPath: プロジェクトに追加したzipファイルのパスの文字列
toDestination: 解凍したzipの中身を展開する場所のパスの文字列
overwrite: 上書きを許可するかどうかのBOOL値
password: zipのパスワードの文字列
error: エラー参照の設定
delegate: デリゲートの設定

デリゲートを設定しておけば、zip解凍の処理が完了した時に以下のメソッドが呼ばれるので、ここでzipの中身のファイルを読み込んで利用する処理を実装します。

- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath


6. サンプルコード
例として、ViewController.m内に実装してみました。

#import "ViewController.h"
#import "SSZipArchive.h"

@interface ViewController () <SSZipArchiveDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // パスワード付きzipを解凍する
    NSString *zipFilePath = [[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"zip"];
    NSString *destinationPath = NSTemporaryDirectory();
    NSString *password = @"12345";
    NSError *error = nil;
    [SSZipArchive unzipFileAtPath:zipFilePath
                    toDestination:destinationPath
                        overwrite:YES
                         password:password
                            error:&error
                         delegate:self];
    if (error) {
        // エラーが発生した場合
        NSLog(@"error:%@", error);
    }

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - SSZipArchiveDelegate
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {

    // 解凍したzipファイルから画像ファイルを読み込んでUIImageViewに設定する
    NSString *filePath = [NSString stringWithFormat:@"%@/photo1.jpg",unzippedPath];
    NSData *photoData = [NSData dataWithContentsOfFile:filePath];
    self.imageView.image = [UIImage imageWithData:photoData scale:[[UIScreen mainScreen] scale]];
}

今回のサンプルコード
GitHub - travitu/ZipArchiveSample

iBeaconの動作テスト用サンプルコード

個人的にiBeaconの検証した時のソースコードが残っていたので、iOS8対応の処理などを追加して基本自分用にGitHubに上げてみました。
iPhone2台を使った動作テスト用になります。
ご使用や改変などはご自由にどうぞ。

iBeaconの送信側、受信側の基本的な動作は確認できる状態になっていると思いますが、テストのパターンも定まっていなかったので、細かくテストはしていません。バックグラウンドやローカル通知関連の処理など配慮が不足している箇所や修正が必要な可能性がありますので、ご使用の際はご注意ください。

ペリフェラル用サンプル(Beacon送信側)
GitHub - travitu/iBeaconPeripheralSample

セントラル用サンプル(Beacon受信側)
GitHub - travitu/iBeaconCentralSample

Cocos2d-x v3.3のAndroid NDK対応バージョンについて

1週間ほど前に、Cocos2d-x-v3.3のfinalがリリースされています。

Cocos2d-x 3.3 Final Released: Smaller Size, More 3D Features, New Audio Engine | Cocos2d-x

このニュースの記事を見ると、どうやらv3.3からAndroid NDK r10c 以上の利用を推奨しています。
Android5.0のバグに対応するのが推奨の理由のようですが、Android5.0の端末を持っていないので確認できていません。
自分の開発環境では、NDK r9dでCocos2d-x-v3.3を使っていますが、今のところ問題はない感じです。

最新版Android NDKのダウンロードリンクはここです
Android NDK | Android Developers

この記事を書いている時点では、最新版はNDK r10dとなっていました。