1

パスワードを同期するための小さなツールを書いています。この目的のために、独自の KeyChain を使用しています。保存する前に、この KeyChain をクリアしたいです。しかし、SecItemDelete関数の使い方がよくわからないようです。

NSMutableDictionary *deleteQuery = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                            kSecClassGenericPassword, kSecClass,
                                            kSecMatchLimit, kSecMatchLimitAll, nil];

    OSStatus status = SecItemDelete((__bridge CFDictionaryRef)deleteQuery);
    NSLog(@"%@", SecCopyErrorMessageString(status, NULL));

ここまで書いてきましたが、残念ながら私のアイテム(Root.FooとRoot.Barという)がKeyChainに残っています。また、この関数はどの KeyChain を検索する必要があるかをどのように認識しているのでしょうか。私が気に入っているほとんどの例は、すべてのアプリケーションがデフォルトで独自の KeyChain を持っている iOS に関するものです。

助けてくれてありがとう:)

4

1 に答える 1

5

解決しました:

検索する KeyChains の配列を渡し忘れました! iOS では常にアプリのデフォルトの KeyChain が使用されるようですが、Mac OS では KeyChain を SecKeychainRefs を含む配列として指定する必要があります。

NSMutableDictionary *q = [NSMutableDictionary dictionary];
    [q setObject:kSecClassGenericPassword forKey:kSecClass];
    [q setObject:[NSArray arrayWithObject:(__bridge id)keyChain] forKey:kSecMatchSearchList];
    [q setObject:kSecMatchLimitAll forKey:kSecMatchLimit];
    SecItemDelete((__bridge CFDictionaryRef)q);

このコードは完全に機能しました。

于 2012-07-27T11:48:18.877 に答える