OSStatus错误代码-34018

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员工于20163月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

所以-34018errSecMissingEntitlement和评论说:

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/)

希望其中一些有用!