UICKeyChainStoreはiOSのkeychainをNSUserDefaultsみたいに簡単に操作するためのライブラリですね。
https://github.com/kishikawakatsumi/UICKeyChainStore (release notes)
大変便利に使っていますが、いくつか知っておくべきことがあるのでメモしておきます。
エラーハンドリング
最初のバージョンはエラーハンドリングができませんでしたが、v1.1.0でできるようになりました。KeyChainの操作はまれに失敗することがります(たとえば status=-34018)。この種のエラーは原因不明で回復もできないため、仮にユーザーの端末でおきても対処のしようがありません。
とはいえユーザーの手元で起きているかどうかは把握したいところ。エラーが起きたらアプリをクラッシュさせて、Crashlyticsなどのエラー収集サービスに送りましょう。
前方互換性(forward compatibility)
v1で保存したデータはv2で読み込めます。つまり後方互換性はある。一方で、v2で保存したデータはv1で読み込めません。つまりv1 - v2間で前方互換性はないのです。これはv1のデータ保存&検索のやり方がおかしかったので、実装としてはv2が妥当です。しかし、まれにv2で書き込んだデータをv1で読み込みたいこともあります。
そこでv2.0.4からは、v1で読み込める形式でデータを保存することができるようになってます。
使い方は UICKeyChainStoreForwardCompatibilityTests.m のように、 genericAttribute:key
にkeyと同じ文字列を渡してください。
- (void)testReadV2DataFromV1
{
// v2でデータを書き込む(v1互換形式)
[UICKeyChainStore setString:@"http://example.com/" forKey:@"url" genericAttribute:@"url"];
// v1でデータを読み込む(genericAttribute:keyがなければfailする)
XCTAssertEqualObjects([UICv1KeyChainStore stringForKey:@"url"], @"http://example.com/");
}
その他
最新版だと allKeys
などもあるし、なるべく最新版を使うほうがいいです。一方で、オプションが微妙に異なるAPIが増えてきて、正しく使うのがむずかしくなってきています。実用上は、ラッパークラスを作ってそれ経由でのみ操作するのがよさそうです。