2

この投稿のように、シリアル化された nsdictionary をキーチェーンに保存してロードしています ( Store NSDictionary in keychain )が、辞書の内容を更新/編集できるようにする必要があるため、削除して再度追加したいと思います。

私はそれを行う方法がわかりません。上記の投稿から取得した次のコードがあります。

    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"arbitraryId" accessGroup:nil]
    NSString *error;
    //The following NSData object may be stored in the Keychain
    NSData *dictionaryRep = [NSPropertyListSerialization dataFromPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
    [keychain setObject:dictionaryRep forKey:kSecAttrService];

    //When the NSData object object is retrieved from the Keychain, you convert it back to NSDictionary type
    dictionaryRep = [keychain objectForKey:kSecAttrServce];
    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:dictionaryRep mutabilityOption:NSPropertyListImmutable format:nil errorDescription:&error];

    SecItemDelete((CFDictionaryRef)dictionaryRep); // doesnt work

値はキーチェーンから削除されません。

ありがとう

4

2 に答える 2

1

これは、データを保存する奇妙な場所です。kSecAttrService暗号化されていない に入れています。これを入れるつもりだと思いますkSecValueData(これは暗号化されたキーチェーンアイテムの唯一の部分です)。

つまり、アイテムを削除する必要はありません。[keychain setObject:forKey:]いつでも値を更新するために使用できます。KeychainItemWrapperアイテムが既に存在するかどうかを自動的に検出し、存在する場合は更新します。

を使用してアイテムを削除する場合はKeychainItemWrapper、 を使用します-resetKeychainItem。これはSecItemDelete()正しい値で呼び出します。一般に、キーチェーン API と正確な仕組みをよく理解していないと、KeychainItemWrapperと の raw 呼び出しを組み合わせて使用​​することはできません。SecItem*KeychainItemWrapper

于 2013-04-23T16:55:11.643 に答える
0

キーチェーンのプロパティへのアクセスに取り組んだことはありませんが。しかしSecItemDelete、Appleドキュメントのメソッドを見ると、予想されるパラメーターは辞書であり、コードdictionaryRepではこれがNSData型です。

https://developer.apple.com/library/mac/#documentation/security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/c_ref/SecItemDelete

ここで質問が見つかりました。

Mac OS X で自分で作成した KeyChain のすべてのアイテムを削除したい

于 2013-04-23T16:53:04.923 に答える