我在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
。上面的查询在代码中的其他点找到钥匙串项。我觉得我错过了一些关于为什么不起作用的细节。
答案 0 :(得分:2)
此blog post会谈到您的问题。
简而言之,您还需要为键kSecAttrAccount
和kSecAttrService
设置值。 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>;
}