iOS」タグアーカイブ

iOS プロジェクトで Base64 エンコード/デコードを行う

iOS プロジェクトで Base64 エンコードが必要になったので、取り急ぎ簡単な方法を探しました。
確認は Mac OS X 10.7.3 / Xcode 4.3.1 で行っています。

(1) http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html から NSData_Base64.zip をダウンロードし、解凍します。

(2) NSData_Base64 フォルダ内にある NSData+Base64.h と NSData+Base64.m の2ファイルを開発中のプロジェクトに追加します。

(3) あとはエンコードしたいところで、

// Encode base64
NSData *targetData = ...
NSString *encodedString = [targetData base64EncodedString];

デコードなら、

// Decode base64
NSString *base64String = ...
NSData * decodedData = [NSData dataFromBase64String:base64String];

といった具合に使用します。NSData+Base64.h のインポートを忘れないようにしましょう。

OpenSSL を使っても Base64 エンコーディングできるようですが、OpenSSL 関連のライブラリは iOS に含まれていないので、今回その方法は採用しませんでした。
ここ http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html には OpenSSL を使用した方法も説明されているので、興味のある方はどうぞ。

ちなみに、-base64EncodedString を使用した場合、64文字ごとに改行した Base64 文字列が生成されます。このとき使用される改行コードは CR+LF です。改行して欲しくないとか、80文字ごとで改行して欲しいなどの要求がある場合は、ソースを少しだけ調整すれば対応可能なようですので、ソースを一読されることをお勧めします。

iOS 用 OpenSSL ライブラリの作成

iOS アプリでデータの暗号化、復号を行う場合に、OpenSSL を使用したいことがあると思います。
iOS には Common Crypto というライブラリもありますので、こちらも検討してみることをお勧めしますが、
ここでは OpenSSL ライブラリの作成方法を簡単に説明します。
確認は Mac OS X 10.7.3 / Xcode 4.3.1 で行っています。

OpenSSL ライブラリ(libssl.a と libcrypto.a)の作成は以下の方法が簡単です。

(1) https://github.com/x2on/OpenSSL-for-iPhone からプロジェクトをダウンロードし、zip を解凍します。
試したときは x2on-OpenSSL-for-iPhone-openssl-1.0.0d-4-gc637f77.zip がダウンロードされました。

(2) シェルスクリプト build-libssl.sh がプロジェクトフォルダ内にあるので、これを開き、ベースとなる OpenSSL のバージョンと iOS SDK のバージョンを確認します。必要であれば調整します。

###########################################################################
#  Change values here                                                     #
#                                                                         #
VERSION="1.0.0g"                                                          #
SDKVERSION="5.0"                                                          #
#                                                                         #
###########################################################################

対応する iOS SDK が存在していないと、ライブラリの作成は失敗します。

(3) build-libssl.sh をターミナルで実行します。OpenSSL のソースが自動的にダウンロードされ、ライブラリの作成が始まります。作成されるライブラリは、i386、armv6、armv7 アーキテクチャ用のモジュールをまとめたスタティックライブラリです。

(4) ライブラリの作成が完了したら、プロジェクトフォルダ内の ./include と ./lib を、OpenSSL ライブラリを必要とするプロジェクトにコピーして使用します。OpenSSL を追加したプロジェクトのビルド設定にある検索パスも設定しておきましょう。前出の include と lib を openssl フォルダにまとめてプロジェクトに追加した場合、Header Search Paths に $(SRCROOT)/openssl/include を Library Search Paths に $(SRCROOT)/openssl/lib のように設定します。検索パスはライブラリを追加した場所に応じて適当に調整してください。

NSLog() でクラス名、メソッド名を表示

NSLog() でインスタンスのクラス名を表示する方法。

NSLog(@"%@", NSStringFromClass([self class]));

NSLog() でメソッド名を表示する方法。

NSLog(@"%@", NSStringFromSelector(_cmd));

NSLog() でメソッド名とそのメソッドが属するクラス名を同時に表示する方法。

NSLog(@"%s", __func__);
NSLog(@"%s", __FUNCTION__);
NSLog(@"%s", __PRETTY_FUNCTION__);

NSLog() でソースファイル名を表示する方法。

NSLog(@"%s", __FILE__);

NSLog() でソースファイル内の行番号を表示する方法。

NSLog(@"%d", __LINE__);

NSLog() でコールスタックを表示する方法。

NSLog(@"%@", [NSThread callStackSymbols]);

NSLog() で UIView 階層を表示する方法。

NSLog(@"%@", [self.view recursiveDescription]);

例)

- (void)viewWillAppear:(BOOL)animated
{
    NSLog(@"In Objective-C method...");
    NSLog(@"%@", NSStringFromClass([self class]));
    NSLog(@"%@", NSStringFromSelector(_cmd));

    NSLog(@"%s", __func__);
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%s", __PRETTY_FUNCTION__);

    NSLog(@"%s", __FILE__);

    NSLog(@"%d", __LINE__);
    
    NSLog(@"%@", [NSThread callStackSymbols]);
    
    NSLog(@"%@", [self.view recursiveDescription]);         // 非公開メソッド 
    
    Foo foo;
    foo.doSomething();

    doIt();
}

void Foo::doSomething()
{
    NSLog(@"In C++ function...");
    NSLog(@"%s", __func__);
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

void doIt()
{
    NSLog(@"In C function...");
    NSLog(@"%s", __func__);
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%s", __PRETTY_FUNCTION__);
}
2012-03-14 13:40:26.936 NSLogTest[1779:f803] In Objective-C method...
2012-03-14 13:40:26.939 NSLogTest[1779:f803] ViewController
2012-03-14 13:40:26.940 NSLogTest[1779:f803] viewWillAppear:
2012-03-14 13:40:26.940 NSLogTest[1779:f803] -[ViewController viewWillAppear:]
2012-03-14 13:40:26.941 NSLogTest[1779:f803] -[ViewController viewWillAppear:]
2012-03-14 13:40:26.942 NSLogTest[1779:f803] -[ViewController viewWillAppear:]
2012-03-14 13:40:26.942 NSLogTest[1779:f803] /path/to/file/ViewController.mm
2012-03-14 13:40:26.943 NSLogTest[1779:f803] 51
2012-03-14 13:40:26.946 NSLogTest[1779:f803] (
	0   NSLogTest                           0x00003157 -[ViewController viewWillAppear:] + 311
	1   UIKit                               0x000db38f -[UIViewController _setViewAppearState:isAnimating:] + 158
	2   UIKit                               0x000db5eb -[UIViewController __viewWillAppear:] + 62
        .........
	23  UIKit                               0x00010c65 -[UIApplication _run] + 576
	24  UIKit                               0x00012626 UIApplicationMain + 1163
	25  NSLogTest                           0x00002a62 main + 130
	26  NSLogTest                           0x000029d5 start + 53
)
2012-03-14 13:40:27.164 NSLogTest[1779:f803] >
   | ; contentOffset: {0, 0}>
   |    | >
   |    | >
2012-03-14 13:40:27.165 NSLogTest[1779:f803] In C++ function...
2012-03-14 13:40:27.168 NSLogTest[1779:f803] doSomething
2012-03-14 13:40:27.169 NSLogTest[1779:f803] doSomething
2012-03-14 13:40:27.169 NSLogTest[1779:f803] void Foo::doSomething()
2012-03-14 13:52:04.307 NSLogTest[1815:f803] In C function...
2012-03-14 13:52:04.308 NSLogTest[1815:f803] doIt
2012-03-14 13:52:04.308 NSLogTest[1815:f803] doIt
2012-03-14 13:52:04.308 NSLogTest[1815:f803] void doIt()