Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS密钥链写入值导致错误代码-34018_Ios_Keychain_Keychainitemwrapper - Fatal编程技术网

iOS密钥链写入值导致错误代码-34018

iOS密钥链写入值导致错误代码-34018,ios,keychain,keychainitemwrapper,Ios,Keychain,Keychainitemwrapper,我有一个iOS应用程序,它在钥匙链中存储一些敏感信息。 在将值写入密钥链时,我得到错误代码-34018 我目前正在使用Apple的iOS KeyChainItemWrapper类 以下两行代码都接收相同的错误代码 OSStatus res1 = SecItemCopyMatching((__bridge CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes); OSStatus res = SecItemUpdate

我有一个iOS应用程序,它在钥匙链中存储一些敏感信息。 在将值写入密钥链时,我得到错误代码-34018

我目前正在使用Apple的iOS KeyChainItemWrapper类

以下两行代码都接收相同的错误代码

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的回答。我找到了一个解决办法:

  • 停止任务以终止应用程序(如果您已经在运行应用程序)
  • 在您的设备上手动启动应用程序。不要使用Xcode
  • 使用Xcode重新启动应用程序

  • 正如其他人所提到的,这是一个钥匙链漏洞,苹果已经意识到,并且至少在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中得到了解决

    • 我们怀疑这个问题可能还有更多的原因

    因此,如果您在运行iOS 9.3或更高版本的用户设备(Xcode未与之交谈的设备)上看到此问题,请提交一份有关此问题的错误报告。尝试将设备系统日志包含在您的bug报告中(我意识到在处理客户设备时可能会很棘手;一个选项是要求客户安装Apple Configurator,这样他们就可以查看系统日志)。如果你确实提交了一个bug,请发布你的bug编号,仅供记录

    我谨代表苹果公司感谢所有人,感谢他们为追查这个相当可怕的问题所做的努力

    分享和享受


    如果有人带着此错误回来,并且带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,那么

  • App_Name.authorities文件打开密钥密钥链访问组密钥为数组类型
  • 在item0下,将项目包id的值设置为-$(AppIdentifierPrefix)com.Apple.testAp

  • 有趣。在这一点上,似乎没有解决办法。请参见此处的苹果工程师评论:在@coco链接的帖子中,苹果于2016年3月22日回复称,他们认为该漏洞已在iOS 9.3中修复。@Kuba,Zeb的回答可能解决了您的问题,因为您遇到的问题与OP遇到的问题不同。发布此问题时,iOS 10甚至不存在。现在可能与此错误更相关。不过请注意,我可以在主线程上重新创建此错误。在我的情况下,当我重新启动应用程序时,错误消失了,允许我