へんてこのブログ

日々気づいたことや、最近やっていることを書いています

SSKeychainでNSDictionary形式で保存する方法

はじめに

OSX/iOSアプリを開発しててキーチェーンにパスワードとかを保存したいってなった
そのとき、パスワード一個だけとかならいいけどユーザー名とかも一緒に保存したかった
cocoapodsにSSKeychainっていう便利なライブラリがあったので、使ってみたけど普通に使うとパスワードはパスワード、ユーザー名はユーザー名といったように個別(serviceNameかaccountを変えて)に保存するしかないかなって感じだった
これでは、キーチェーンにアクセスする時に聞かれる承認ダイアログが個数分聞かれてしまうので不便
出来るなら一気に取り出したかった

NSDictionaryで保存出来た

どうやるのかなーってhttps://github.com/soffes/sskeychain/tree/master/Exampleとか見てみたけど実装が書いてない…みたいになった
しょうがないからテストを眺めてたら書いてあった
SSKeychainTests.mの43行目から

// set password to a dictionary
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInteger:1], @"number",
                                @"4 8 15 16 23 42", @"string",
                                nil];
query.passwordObject = dictionary;
XCTAssertTrue([query save:&error], @"Unable to save item: %@", error);
    
// check password
query = [[SSKeychainQuery alloc] init];
query.service = kSSToolkitTestsServiceName;
query.account = kSSToolkitTestsAccountName;
query.passwordObject = nil;
XCTAssertTrue([query fetch:&error], @"Unable to fetch keychain item: %@", error);
XCTAssertEqualObjects(query.passwordObject, dictionary, @"Passwords were not equal");

保存と取り出しは上記の方法で簡単に出来た
あと削除も普通にこんな感じで行けた

[SSKeychain deletePasswordForService:kSSToolkitTestsServiceName account:kSSToolkitTestsAccountName];

すごい便利