OSStatus错误代码

我使用SecItemCopyMatching来访问iOS钥匙串。 大约有百分之一我从应用程序从后台重新启动后-34018得到-34018结果代码。 该文件指出:

为钥匙串服务分配的错误空间是不连续的:-25240至-25279和-25290至-25329。 钥匙串项目服务也可以返回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;
    }
}

我一直在研究同样的错误。

其要点在于,苹果公司使用的安全服务是为了与钥匙链进行沟通,在极少数情况下,当用户的设备内存不足时,苹果会崩溃并带走应用程序与钥匙链对话的能力,从而导致可怕的 - 34018。

这只有在像有些人声称的那样通过Xcode运行时才会发生。

这是苹果公司的一名员工从苹果开发者论坛取得的最新数据:

更新:我们终于能够在iOS 8.3上重现-34018错误。 这是确定根本原因然后提出修复的第一步。

像往常一样,我们不能承诺发布时间框架,但这已经影响了许多开发人员,我们真的想要解决这个问题。

早些时候,我建议在应用程序中添加一个小延迟:didFinishLaunchingWithOptions和applicationDidBecomeActive:在访问钥匙串之前作为解决方法。 但是,这实际上并没有帮助。 这意味着除了重新启动应用以外,目前还没有已知的解决方法。

这个问题似乎与内存压力有关,所以在处理内存警告时可能会更积极地缓解这个问题。

来自另一位苹果员工:

  • 钥匙链工程深知这个问题的重要性。
  • 苹果的主要问题是在这里再现失败。
  • 我们现在可以做到这一点(主要得益于你们在提交bug和跟踪bug报告方面所做的工作)。
  • 来自20163月22日的另一位Apple员工:

    好的,这是最新的。 这是一个复杂的问题,有多种可能的原因:问题的一些实例是由不正确的应用程序签名造成的。 您可以轻松区分这种情况,因为问题是100%可重现的。 该问题的一些实例是由iOS如何支持应用程序开发的错误引起的(r。23,991,853)。 由于OS(23,770,418)中的另一个缺陷掩盖了它的影响,这意味着当设备处于内存压力下时才会出现问题,因此对此进行调试变得更加复杂。 我们相信这些问题已在iOS 9.3中解决。 我们怀疑这个问题可能还有更多原因。 因此,如果您在运行iOS 9.3或更高版本的用户设备(未与Xcode讨论过的设备)上看到此问题,请提交关于它的错误报告。 尝试将设备系统日志包含在您的错误报告中(我认识到在处理客户设备时可能会非常棘手;一种选择是要求客户安装Apple Configurator,以便他们查看系统日志)。 如果您发现了错误,请发布您的错误编号,以备记录。 我代表苹果公司感谢所有人为帮助追踪这个相当可怕的问题所做的努力。 分享和享受

    不幸的是,没有已知的解决方法,这个问题在9.3.2 Beta 1(13F51a)中仍然没有解决。


    经过一番研究,我发现这个:http://opensource.apple.com/source/Security/Security-55471/sec/Security/SecBasePriv.h

    所以-34018errSecMissingEntitlement ,注释说

    Internal error when a required entitlement isn't present.
    

    运行单元测试时是否遇到此错误? 如果是这样,这可能有所帮助:https://stackoverflow.com/a/22305193/171933

    github上的这个问题表明,它似乎只是在从Xcode进行调试时发生:https://github.com/soffes/sskeychain/issues/97(另请参阅https://stackoverflow.com/a/28256591/171933)

    希望这会有所帮助!


    此代码适用于我:

    static const UInt8 kKeychainItemIdentifier[] = "com.apple.dts.KeychainUI";
    
    - (NSData *)getKeychainData:(NSString *)key
    {
        NSData *keychainItemID = [NSData dataWithBytes:kKeychainItemIdentifier length:strlen((const char *)kKeychainItemIdentifier)];
    
        NSDictionary *query = @{
            (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
            (__bridge id)kSecAttrService: SEC_ATTR_SERVICE,
            (__bridge id)kSecAttrAccount: key,
            (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,
            (__bridge id)kSecAttrGeneric: keychainItemID
        };
    
        CFDataRef result = NULL;
    
        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;
        }
    }
    

    与OP代码的主要区别在于为查询添加了通用属性。 钥匙串项目标识符是苹果的默认设置。 这背后的原因来区分可能不同的钥匙链项目彼此。 这是使钥匙链项目访问更加可靠的一种方法。 换句话说,这基本上可以确保你访问苹果的默认钥匙串。

    链接地址: http://www.djcxy.com/p/83287.html

    上一篇: OSStatus error code

    下一篇: KeychainItemWrapper error when specifying an access group