我有一个iOS应用程序,在Keychain中存储访问令牌.在过去的几个月里,我注意到大约2%的用户在尝试检索令牌时获得了errSecItemNotFound.
所有相关的StackOverflow线程都指向后台任务是罪魁祸首(iOS KeyChain不从后台检索值)或在查询字符串中包含无效参数(Keychain:Item报告为errSecItemNotFound,但在添加时接收errSecDuplicateItem).
我正在使用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];
Run Code Online (Sandbox Code Playgroud)
(设置kSecAttrGeneric可能是多余的,但它不会影响查询的结果)
为了记录,我遇到了SSKeyChain和UICKeychainStore的这个错误.
任何提示都将受到高度赞赏:]
我正在尝试在我的iOS应用程序中实现KeyChain共享,以在不同的iOS应用程序之间共享密码.
我正在使用该库UICKeyChainStore来实现此目的.
AppDelegate.m(这个有效)
self.keychainStore = [UICKeyChainStore keyChainStoreWithService:@"PasswordService" accessGroup:@"group_name"];
self.keychainStore[@"password"] = @"abcd1234";
NSLog(@"%@", self.keychainStore[@"password"]);
Run Code Online (Sandbox Code Playgroud)
在我的ViewController的ViewDidLoad方法中,相同的代码只是在控制台中打印(null).
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.keychainStore[@"p2"] = @"1234";
NSLog(@"%@", appDelegate.keychainStore[@"p2"]);
Run Code Online (Sandbox Code Playgroud)
当我深入挖掘库时,抛出的错误消息是:
Error Domain = com.kishikawakatsumi.uickeychainstore Code = -34018"发生了安全错误." UserInfo = 0x174e76540 {NSLocalizedDescription =发生了安全错误.}