Fro*_*rne 4 objective-c keychain ios ios9
我面临一个奇怪的问题。与此处提出的问题非常相似,但未得到答复:Read from keychain results in errSecItemNotFound 25300
我的代码将字符串密码保存在 iOS 钥匙串中,以便稍后访问。大多数时候它工作得很好,我可以在重新安装或设备重新启动或两者后取回密码。
问题:有时,实际上很少见且难以重现,它不返回密码,而是返回 null 和错误状态:-25300(errSecItemNotFound)。另外,这个问题在iOS 9更新后变得更加突出。iOS 9.1 上也会发生这种情况。
现在,我一直在网上寻找解决方案。发现以下内容,在某种程度上与该问题相关,但不解决我的情况:
有谁知道为什么会发生这种情况?非常感谢。
更新
设置代码:
NSMutableDictionary *query = [self _queryForService:service account:account];
[query setObject:password forKey:(__bridge id)kSecValueData];
status = SecItemAdd((__bridge CFDictionaryRef)query, NULL);
}
if (status != errSecSuccess && error != NULL) {
*error = [NSError errorWithDomain:kAppKeychainErrorDomain code:status userInfo:nil];
}
return (status == noErr);
Run Code Online (Sandbox Code Playgroud)
最终查询:
{
acct = user;
class = genp;
svce = "myBundleIdentifier";
"v_Data" = <36314541 38463339 2d363737 462d3445 34372d42 4339452d 31324633 46463937 35374546>;}
Run Code Online (Sandbox Code Playgroud)
获取代码:
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 != errSecSuccess && error != NULL) {
*error = [NSError errorWithDomain:kAppKeychainErrorDomain code:status userInfo:nil];
return nil;
}
return (__bridge_transfer NSData *)result;
Run Code Online (Sandbox Code Playgroud)
最终查询:
{
acct = user;
class = genp;
"m_Limit" = "m_LimitOne";
"r_Data" = 1;
svce = "myBundleIdentifier";}
Run Code Online (Sandbox Code Playgroud)
我可以看到这个问题已经很老了,但我最近几乎疯狂地尝试解决钥匙串的类似问题,所以我将分享它,以防有人遇到它。
问题是应用程序在后台写入钥匙串时会随机崩溃。原因是,当用户的手机上有密码并且选择的访问级别是最安全的时,iOS 将不允许您的应用程序在受密码保护的情况下对钥匙串进行更改。
| 归档时间: |
|
| 查看次数: |
1984 次 |
| 最近记录: |