iOS密钥链写入值导致错误代码-34018
我有一个iOS应用程序,它在钥匙链中存储一些敏感信息。 在将值写入密钥链时,我得到错误代码-34018 我目前正在使用Apple的iOS KeyChainItemWrapper类 以下两行代码都接收相同的错误代码iOS密钥链写入值导致错误代码-34018,ios,keychain,keychainitemwrapper,Ios,Keychain,Keychainitemwrapper,我有一个iOS应用程序,它在钥匙链中存储一些敏感信息。 在将值写入密钥链时,我得到错误代码-34018 我目前正在使用Apple的iOS KeyChainItemWrapper类 以下两行代码都接收相同的错误代码 OSStatus res1 = SecItemCopyMatching((__bridge CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes); OSStatus res = SecItemUpdate
OSStatus res1 = SecItemCopyMatching((__bridge CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes);
OSStatus res = SecItemUpdate((__bridge CFDictionaryRef)updateItem, (__bridge CFDictionaryRef)tempCheck);
此问题并非每次都会出现,而是间歇性出现。一旦出现此错误,我就无法再将任何值写入密钥链
dispatch_async(dispatch_get_main_queue(), ^{
// save/write to keychain
})
我打印了错误描述,如下所示:
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:res userInfo:nil];
这是错误打印出来的:
Error: Error Domain=NSOSStatusErrorDomain Code=-34018 "The operation couldn’t be completed. (OSStatus error -34018.)"
这似乎是Keychain中的一个bug,它只在您从xcode启动应用程序时出现。请看这里: 我们对它进行了大量的调试,似乎在访问密钥链时遇到了问题 该应用程序是从后台启动的。这只会发生在 调试器(即从Xcode启动时)。我们认为这个问题 在我们的例子中,可能与使应用程序保持活动状态的调试器有关 即使它应该被操作系统杀死。事实上,我们试着运行 应用程序,然后把它放在后台,并启动许多其他应用程序占用 内存使用调试器,从应用程序恢复应用程序时出现错误 后台,而没有调试器它没有(我们至少运行了 每个测试10次)
使用钥匙链解决此问题的一种方法是使用dispatch_async来允许应用程序启动。当从后台打开应用程序时,此功能会起作用。还要确保钥匙链上有
kSecAttrAccessibleAfterFirstUnlock
辅助功能设置
dispatch_async(dispatch_get_main_queue(), ^{
// save/write to keychain
})
这让我耽搁了2个小时,然后我找到了一个快速的“修复方法”——重新启动iOS设备 引用在 来自用户的详细信息 正如其他人所报告的,当通过Xcode启动并附加调试器时,最容易观察到这个神秘的钥匙链错误。一旦错误开始发生,在重新启动设备之前,无论内存压力如何,钥匙链似乎都不会自动恢复正常
当我重新启动设备时,错误消失了,允许我继续测试。不知道还能做什么。在我的情况下,转移到NSUserDefaults或其他存储解决方案是不可能的。根据@iCaramba的回答。我找到了一个解决办法:
正如其他人所提到的,这是一个钥匙链漏洞,苹果已经意识到,并且至少在2015年年中就已经意识到了 然而,截至2016年3月22日,苹果表示: 我们相信这些问题在iOS 9.3中得到了解决 iOS 9.3于2016年3月21日发布 请参阅线程: 引用苹果员工的回答: 2016年3月22日凌晨3:28 好的,这是最新消息。这是一个复杂的问题,可能有多种原因:
- 该问题的某些实例是由不正确的应用程序签名引起的。您可以很容易地区分这种情况,因为问题是100%可重复的
- 这个问题的一些实例是由iOS如何支持应用程序开发的错误引起的(r.23991853)。由于操作系统中的另一个bug(r.23770418)掩盖了它的影响,这意味着只有在设备内存不足时,问题才会出现,因此调试工作变得复杂 我们相信这些问题在iOS 9.3中得到了解决
- 我们怀疑这个问题可能还有更多的原因
如果有人带着此错误回来,并且带iOS10的XCode8将返回,您可能必须在选项卡
功能中启用KeyChain Share
:
我正在使用apple的GenericKeychain类: 在这个文件中,我在这一行中指定了我的自定义accessGroupstatic let accessGroup=“[YOUR APP ID PREFIX].com.example.apple samplecode.GenericKeychainShared”
返回到静态后,let accessGroup:String?=无问题已解决。:) 确保钥匙链共享必须在项目目标中的功能下 在我的情况下,App_Name.authentications文件的bundle id与我的项目bundle id不同。因此,我更改App_Name.authentications文件中的bundle id作为我的项目bundle id。 e、 假设您的项目包id是com.Apple.testApp,那么
有趣。在这一点上,似乎没有解决办法。请参见此处的苹果工程师评论:在@coco链接的帖子中,苹果于2016年3月22日回复称,他们认为该漏洞已在iOS 9.3中修复。@Kuba,Zeb的回答可能解决了您的问题,因为您遇到的问题与OP遇到的问题不同。发布此问题时,iOS 10甚至不存在。现在可能与此错误更相关。不过请注意,我可以在主线程上重新创建此错误。在我的情况下,当我重新启动应用程序时,错误消失了,允许我