Ran*_*lue 48 objective-c keychain ios ios9
我SecItemCopyMatching
用来访问iOS钥匙串.大约一百次,我-34018
在从后台重新启动应用程序后立即获得结果代码.文件说明:
Keychain Services的指定错误空间是不连续的:-25240到-25279和-25290到-25329.Keychain Item Services也可以返回noErr(0)或paramErr(-50)或CSSM结果代码
所以它似乎-34018
是一个'CSSM结果代码'.我已按照建议的链接但找不到结果代码.
它的-34018
结果代码?如何获得更可靠的钥匙串访问?
- (NSData *)getKeychainData:(NSString *)key
{
NSDictionary *query = @{
(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService:SEC_ATTR_SERVICE,
(__bridge id)kSecAttrAccount:key,
(__bridge id)kSecReturnData:@YES
};
CFDataRef result = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if(status == errSecItemNotFound) {
return nil;
}
if(status == noErr) {
return CFBridgingRelease(result);
} else {
[self logError:[NSString stringWithFormat:@"SecItemCopyMatching status %d", (int)status] :nil];
return nil;
}
}
Run Code Online (Sandbox Code Playgroud)
Seg*_*gev 21
我一直在研究同样的错误.
它的要点是苹果安全服务用于与密钥链通信,在极少数情况下,当用户的设备内存不足,崩溃并带走应用程序与密钥链交谈的能力,这导致可怕的 - 34018.
只有在某些人可能会声称的Xcode中运行时才会发生这种情况.
这是Apple工作人员从Apple开发者论坛获取的最新数据:
更新:我们终于能够在iOS 8.3上重现-34018错误.这是确定根本原因然后提出修复的第一步.
像往常一样,我们无法承诺发布时间表,但这已经影响了许多开发人员,我们真的想要解决这个问题.
之前我建议在应用程序中添加一个小延迟:didFinishLaunchingWithOptions和applicationDidBecomeActive:在访问钥匙串之前作为变通方法.但是,这实际上似乎没有帮助.这意味着除了重新启动应用程序之外,目前还没有已知的解决方法.
这个问题似乎与内存压力有关,因此在处理内存警告方面可能更积极一些可能会缓解这个问题.
来自另一位Apple员工:
- 钥匙串工程很清楚这个问题的重要性.
- 主要问题是在Apple上重现失败.
- 我们现在能够做到这一点(很大程度上要归功于你们在提交和跟踪你的错误报告时所做的工作).
来自另一位Apple员工于2016年3月22日:
好的,这是最新的.这是一个复杂的问题,有多种可能的原因:问题的某些实例是由不正确的应用程序签名引起的.您可以轻松区分这种情况,因为问题是100%可重现的.问题的一些实例是由iOS支持应用程序开发的错误引起的(r.23,991,853).由于操作系统中的另一个错误(r.23,770,418)掩盖了它的影响,这个问题很复杂,这意味着当设备处于内存压力时问题才会出现.我们相信这些问题已在iOS 9.3中得到解决.我们怀疑这个问题可能还有更多原因.因此,如果您在运行iOS 9.3或更高版本的用户设备(Xcode尚未与之交谈)上看到此问题,请提交有关它的错误报告.尝试将设备系统日志包含在您的错误报告中(我意识到在处理客户设备时可能会非常棘手;一种选择是要求客户安装Apple Configurator,这样他们就可以查看系统日志).如果您确实提交了错误,请发布您的错误号,仅供记录.我代表Apple感谢大家为帮助追查这个相当可怕的问题所做的努力.分享和享受
不幸的是,没有已知的解决方法,并且在9.3.2 Beta 1(13F51a)中问题仍然没有解决
Joh*_*rug 20
经过一些研究,我发现了这个:http://opensource.apple.com/source/Security/Security-55471/sec/Security/SecBasePriv.h
所以-34018
是errSecMissingEntitlement
和评论说:
Internal error when a required entitlement isn't present.
Run Code Online (Sandbox Code Playgroud)
在运行单元测试时是否遇到此错误?如果是这样,这可能会有所帮助:https://stackoverflow.com/a/22305193/171933
github上的这个问题说它似乎只是在从Xcode调试时发生:https://github.com/soffes/sskeychain/issues/97(另见/sf/answers/1977961401/)
希望其中一些有用!
归档时间: |
|
查看次数: |
5763 次 |
最近记录: |