gpt4 book ai didi

ios - SecItemCopyMatching 不断返回 errSecItemNotFound

转载 作者:行者123 更新时间:2023-11-29 12:09:56 24 4
gpt4 key购买 nike

我正在尝试使用钥匙串(keychain)服务来保存一个值,即使用户重新安装应用程序,该值也会持续存在。所以我使用 SecItemCopyMatching 检查一个项目是否存在,它第一次返回 errSecItemNotFound 并使用 SecItemAdd 添加一个新项目,它返回 errSecSuccess,但是_attrs的值为nil。此外,当第二次调用该代码时,SecItemCopyMatching 仍会返回 errSecItemNotFound,就好像未调用 SecItemAdd 一样。那么这可能与什么有关?

    CFMutableDictionaryRef _attrs = nil;
NSString* key = @"<unique key>";
NSMutableDictionary* query = [NSMutableDictionary dictionary];
query[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
query[(__bridge id)kSecAttrLabel] = key;
query[(__bridge id)kSecMatchLimit] = (__bridge id)kSecMatchLimitOne;
query[(__bridge id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;

OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef*)&_attrs);

if (err == errSecSuccess) {
return YES;
}
NSString* str = @"<some data>";
if (err == errSecItemNotFound) {
query[(__bridge id)kSecValueData] = NSData_from_string(string_from_NSString(str));
query[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;
err = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef*)&_attrs);
assert(err == errSecSuccess);
}

最佳答案

您正在为调用 SecItemAdd 重新使用 query,并且此函数的字典中存在的 kSecMatchLimit 值正在中断它。您应该在调用 SecItemAdd 之前删除此 key 。

还值得注意的是,[str dataUsingEncoding:NSUTF8StringEncoding] 可能是比 NSData_from_string(string_from_NSString(str)) 更好的选择,具体取决于您使用的是什么做。

关于ios - SecItemCopyMatching 不断返回 errSecItemNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com