0

我在 iOS 上的钥匙串确实有问题。

这里是self.keychainItemQuery

{
    kSecClass = kSecClassGenericPassword;
    kSecAttrGeneric = "com.mycompany.player";
    kSecMatchLimit = kSecMatchLimitOne;
    kSecReturnAttributes = kCFBooleanTrue;
}

当我做

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)self.keychainItemQuery, &attributes);

我明白了

status == errSecItemNotFound

好吧,这里是self.keychainItemData

{
    kSecAttrAccount = "";
    kSecClass = kSecClassGenericPassword;
    kSecAttrDescription = "";
    kSecAttrGeneric = "com.mycompany.player";
    kSecAttrLabel = "";
    kSecValueData = <35663636 65623135 64303139 65363535>;
}

但是当我这样做时

OSStatus result = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL);

我明白了

result == errSecDuplicateItem

我以为钥匙链物品被锁掉了kSecAttrGeneric。上面的查询在代码中的其他点找到钥匙串项。我觉得我错过了一些关于为什么这不起作用的细节。

4

1 回答 1

2

这篇博文讨论了您的问题。

简而言之,您还需要为 keyskSecAttrAccountkSecAttrService. kSecClassGenericPassword显然从这两个值确定钥匙串条目的唯一性。

您可以重复使用kSecAttrGenericin的值kSecAttrService,但每个钥匙串条目都需要一个唯一kSecAttrAccount值。

更新您的示例,self.keychainItemQuery变为:

{
    kSecClass = kSecClassGenericPassword;
    kSecAttrGeneric = "com.mycompany.player";
    kSecAttrAccount = "account";               // This value should be unique for each entry you add
    kSecAttrService = "com.mycompany.player";
    kSecMatchLimit = kSecMatchLimitOne;
    kSecReturnAttributes = kCFBooleanTrue;
}

self.keychainItemData变成:

{
    kSecAttrAccount = "";
    kSecClass = kSecClassGenericPassword;
    kSecAttrDescription = "";
    kSecAttrGeneric = "com.mycompany.player";
    kSecAttrAccount = "account";               // This value should be unique for each entry you add
    kSecAttrService = "com.mycompany.player";
    kSecAttrLabel = "";
    kSecValueData = <35663636 65623135 64303139 65363535>;
}
于 2013-03-20T15:30:24.547 回答