我正在使用此方法来检索保存的值(并SecItemAdd
用于最初添加它):
+ (NSData *)passwordDataForService:(NSString *)service
account:(NSString *)account error:(NSError **)error {
CFTypeRef result = NULL;
NSMutableDictionary *query = [self _queryForService:service account:account];
[query setObject:(__bridge id)kCFBooleanTrue
forKey:(__bridge id)kSecReturnData];
[query setObject:(__bridge id)kSecMatchLimitOne
forKey:(__bridge id)kSecMatchLimit];
status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
if (status != noErr && error != NULL) {
*error = [NSError errorWithDomain:kSSKeychainErrorDomain code:status
userInfo:nil];
return nil;
}
return (__bridge_transfer NSData *)result;
}
这段代码对大多数用户来说运行良好,但我的一小部分用户 (< 1%) 遇到的结果表明这里的读取或写入失败。不幸的是,我的代码吞下了任何错误(即当它们发生时不会在任何地方记录它们),所以我不知道为什么它在世界上失败了,而且我根本无法在我的任何开发设备上重现这个问题。
有谁知道可以在 iOS 设备上启用的任何可能导致SecItemAdd
或SecItemCopyMatching
失败的安全/权限设置?我试过打开密码锁定,但这似乎没有效果。