在iOS 10模拟器中,SecItemAdd总是返回Xcode 8中的错误-34018

更新 :这个问题已经在Xcode 8.2中解决了。 钥匙串在模拟器中工作,不启用钥匙串共享。

为什么我在Xcode 8 / iOS 10模拟器中调用SecItemAdd函数时总是收到错误-34018?

重现步骤

在Xcode 8中创build一个新的单页iOS应用程序项目。在viewDidLoad运行以下代码(或者打开这个 Xcode项目)。

 let itemKey = "My key" let itemValue = "My secretive bee 🐝" // Remove from Keychain // ---------------- let queryDelete: [String: AnyObject] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: itemKey as AnyObject ] let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary) if resultCodeDelete != noErr { print("Error deleting from Keychain: \(resultCodeDelete)") } // Add to keychain // ---------------- guard let valueData = itemValue.data(using: String.Encoding.utf8) else { print("🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣 Error saving text to Keychain") return } let queryAdd: [String: AnyObject] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: itemKey as AnyObject, kSecValueData as String: valueData as AnyObject, kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked ] let resultCode = SecItemAdd(queryAdd as CFDictionary, nil) if resultCode != noErr { print("🐝🐝🐝🐝🐝🐝🐝🐝🐝 Error saving to Keychain: \(resultCode).") } else { print("🍀🍀🍀🍀🍀🍀🍀🍀🍀 Saved to keychain successfully.") } 

预期成绩

项目被添加到钥匙串。

实际结果

函数SecItemAdd返回以下错误代码: -34018

Xcode版本8.1(8B62),macOS Sierra 10.12.1。

组态

在iOS 10模拟器中进行testing时,始终出现在Xcode 8中。

在iOS 9.3模拟器中testing时,不会发生在Xcode 8中。

演示

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

参考

雷达: https : //openradar.appspot.com/27422249

苹果开发者论坛: https : //forums.developer.apple.com/message/179846

此问题与以下文章不同,因为它始终在Xcode 8中发生。SecItemAdd和SecItemCopyMatching返回错误代码-34018(errSecMissingEntitlement)

我可以通过将Keychain访问组添加到授权文件来解决这个问题。 我打开了testing应用程序中Capabilities部分的Keychain Sharing开关,它也适用于我。

打开开关的屏幕截图

要添加到权利的项目:

 <key>keychain-access-groups</key> <array> <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string> </array> 

我只在macOS Sierra(10.12)上试过这个,所以我不确定它是否适合10.11.5。

在Xcode 8.1 GM版本说明中,苹果公司承认了这个问题,并提出了一个更清晰的解决方法:

如果您的权利文件不包含应用程序标识符权利的值,那么钥匙串API可能无法在模拟器中工作。 (28338972)解决方法:将用户定义的构build设置添加到名为ENTITLEMENTS_REQUIRED的目标,并将该值设置为YES。 这将导致Xcode在构build时自动插入应用程序标识符权利。

请注意,从我所尝试的,它只适用于Xcode 8.1。 尽pipe文本可能会误导您进入构build设置,但您需要将其添加到您的环境variables中。

在这里输入图像描述

Xcode 8.2将解决这个问题:

解决了Xcode 8.2 beta – IDE Keychain APIs在Simulator中正常工作。 (28338972)

如果您有一个没有主机应用程序的testing目标,就会发生这种情况。 修理

  1. 添加虚拟主机应用程序: 在这里输入图像描述

  2. 启用自动代码签名并添加一个团队:

在这里输入图像描述

  1. 在function中启用钥匙串共享

在这里输入图像描述

我在使用电子邮件进行签名时遇到错误,创build新用户或使用Firebase注销。

错误是:

firauth错误域代码17995

我打开了testing应用程序中Capabilities部分的Keychain Sharing开关,它也适用于我。

我正在寻找一个解决scheme,没有使用钥匙串共享,因为这不是我正在寻找的function。 开发者论坛似乎从EvergreenCoder有一个很好的工作,你可以限制在范围内只有iOS 10模拟器(因为这似乎是唯一受影响的模拟器)。 从post:

这个问题似乎是,为了使Xcode正确地将“应用程序标识符”enttile添加到构build的应用程序中,必须至less有一个权利。 这就是为什么钥匙串共享似乎是一个解决scheme,但它只是间接的:任何其他权利似乎工作正常。

你可以像这样创build一个.plist

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-/ <plist version="1.0"> <dict> <key>get-task-allow</key> <true/> </dict> </plist> 

并在“生成设置”下提供该文件的path

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

正如post中所述,这个授权只允许debugging器被附加。

我有一个类似的问题,虽然我试图在设备上运行时出现-34018错误。 我在iOS上使用Sierra的XCode 8.1。 我在一个团队工作,当我们切换到项目设置中的“自动pipe理签名”时,突然出现了这个问题。 当我closures并手动select我的个人资料,一切工作正常。 我最终不得不从钥匙串中删除我的开发人员证书,然后重新select“自动pipe理签名”。 在下一个版本,它为我生成了一个新的签名证书,现在一切正常。 我仍然不确定是什么原因造成的问题,因为其他证书工作正常手动select,而不是由XCodepipe理。 希望这可以帮助别人停止长达数小时的头痛。

它在启用钥匙串共享function之后起作用。