OSStatus错误代码-34018

2020/12/09 12:51 · ios ·  · 0评论

SecItemCopyMatching用来访问iOS钥匙串。-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;
    }
}

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

其要点是安全服务Apple用来与密钥链进行通信,在极少数情况下,当用户设备的内存不足,崩溃并失去应用程序与密钥链进行通信的能力时,这将导致可怕的- 34018。

并非只有某些人声称通过Xcode运行时才会发生这种情况。

这是其中一名Apple员工从Apple开发人员论坛上获取的有关该问题的最新数据

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

像往常一样,我们无法确定发布时间,但是这影响了许多开发人员,我们确实希望解决这个问题。

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

该问题似乎与内存压力有关,因此也许在处理内存警告时更加积极可能会缓解此问题。

来自另一位Apple员工:

  • 钥匙串工程学很清楚这个问题的重要性。
  • 主要问题一直是在苹果电脑上重现故障。
  • 我们现在能够做到这一点(在很大程度上要感谢你们在归档和跟踪错误报告方面所做的工作)。

20163月22日,来自另一位Apple员工

好,这是最新的。这是一个复杂的问题,有多种可能的原因:问题的某些实例是由不正确的应用程序签名引起的。您可以轻松地区分这种情况,因为问题是100%可重现的。该问题的某些实例是由iOS如何支持应用程序开发中的错误引起的(r。23991853)。由于操作系统中的另一个错误(r。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\0";

- (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的代码的主要区别在于向查询添加了通用属性。钥匙串项目标识符是Apple的默认设置。其背后的原因在于将可能的不同钥匙串项彼此区分开。这是使钥匙串物品访问更可靠的一种方法。换而言之,基本上,这可以确保您访问Apple的默认钥匙串。

在尝试了堆栈溢出中的许多修复后,事情仍然对我不起作用。

起作用的是切换Xcode中的钥匙串共享功能。经过构建和运行,它立即起作用。

在此处输入图片说明

本文地址:http://ios.askforanswer.com/osstatuscuowudaima-34018.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!