我有一个在钥匙串中存储访问令牌的 iOS 应用程序。在过去的几个月里,我注意到大约 2% 的用户在尝试检索令牌时会收到errSecItemNotFound 。
所有相关的 StackOverflow 线程都指向后台任务是罪魁祸首(iOS KeyChain 未从后台检索值)或在查询字符串中包含无效参数(Keychain: Item 报告为 errSecItemNotFound,但在添加时收到 errSecDuplicateItem)。
我正在使用kSecAttrAccessibleAfterFirstUnlock所以后台任务应该能够很好地访问钥匙串。
此外,搜索查询如下所示:
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可能是多余的,但无论如何它不会影响查询的结果)
作为记录,我在SSKeyChain和UICKeychainStore都遇到过这个错误。
任何提示将不胜感激:]