例えば、Web サービスの iPhone クライアントの場合、ユーザーに Web サービスのアカウント名とパスワードを入力してもらう必要がある。で、入力してもらったパスワードを安全に保存しなきゃいけないんだけど、嬉しいことに iOS は Keychain Service というパスワードを安全に保存できる仕組みを提供している。
ただ、上記ページを見れば分かる通り、Keychain Service を素で扱うと長ったらしいコードを書かないといけない。ライブラリを使った方がいいね、これ。Google 先生に質問してみたらいくつか教えてくれたんで、その中から CocoaPods に対応しているという理由で、SSkeychain を使うことにした。
CocoaPods に対応しているので、まずプロジェクトの Podfile に
pod 'SSKeychain'
を追加し、
pod install
を実行するだけでインストールが完了する。
あとは、Keychain Service にパスワードを保存したり、逆にパスワードを取り出したりするコードを書くだけ。
#import <SSKeychain/SSKeychain.h> #import "Setting.h" @implementation Setting ... // Keychain Service からパスワードを取得する + (Setting *)loadSetting:(NSError**)error { Setting *setting = [[Setting alloc] init]; setting.account = [[NSUserDefaults standardUserDefaults] stringForKey:@"account"]; setting.password = [SSKeychain passwordForService:@"MyService" account:setting.account error:error]; return setting; } // Keychain Service にパスワードを保存する + (void)saveSetting:(Setting *)setting error:(NSError**)error { [[NSUserDefaults standardUserDefaults] setValue:setting.account forKey:@"account"]; [SSKeychain setPassword:setting.password forService:@"MyService" account:setting.account error:error]; } ... @end
パスワードを取り出すのにアカウント名が必要なので、アカウント名は Keychain Service ではなく NSUserDefaults に保存している。アカウント名もどうにかして Keychain Services に保存したほうがいいのかな。