钥匙串找不到项目但是无法创建项目

时间:2013-03-20 14:40:11

标签: ios objective-c keychain

我在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。上面的查询在代码中的其他点找到钥匙串项。我觉得我错过了一些关于为什么不起作用的细节。

1 个答案:

答案 0 :(得分:2)

blog post会谈到您的问题。

简而言之,您还需要为键kSecAttrAccountkSecAttrService设置值。 kSecClassGenericPassword显然从这两个值中确定了钥匙串条目的唯一性。

您可以在kSecAttrGeneric中重复使用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>;
}