从Keychain检索数据时,有一小部分用户获得errSecItemNotFound

时间:2015-01-20 16:03:45

标签: ios keychain sskeychain uickeychainstore

我有一个iOS应用程序,可以在Keychain中存储访问令牌。在过去的几个月里,我注意到大约2%的用户在尝试检索令牌时会得到 errSecItemNotFound

所有相关的StackOverflow线程都指向后台任务是罪魁祸首(iOS KeyChain not retrieving values from background)或在查询字符串中包含无效参数(Keychain: Item reported as errSecItemNotFound, but receive errSecDuplicateItem on addition)。

我正在使用 kSecAttrAccessibleAfterFirstUnlock ,因此后台任务应该能够正常访问Keychain。

此外,搜索查询如下所示:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
[query setObject:service forKey:(__bridge id)kSecAttrService];
[query setObject:key forKey:(__bridge id)kSecAttrGeneric];
[query setObject:key forKey:(__bridge id)kSecAttrAccount];

(设置 kSecAttrGeneric 可能是多余的,但无论如何它都不会影响查询的结果)

为了记录,我遇到了SSKeyChainUICKeychainStore这个错误。

任何提示都将受到高度赞赏:]

1 个答案:

答案 0 :(得分:5)

我正在使用KDJKeychainItemWrapper并遇到类似的问题。最后,我将其替换为使用kSecAttrGeneric来使用kSecAttrService。这解决了由于未定义服务而未查找条目和重复的所有问题。

我认为kSecClassGenericPassword的主键只是kSecAttrAccount和kSecAttrService。

如果您不使用kSecAttrGeneric,它应该排除自己,也许用户不得不再次输入密码。

同时选择一个不会与其他任何东西发生冲突的服务名称。