最佳答案
更新 : 这个问题在 Xcode 8.2中已经修复。 Keychain 在模拟器中工作,但是没有启用 Keychain 共享。
为什么在调用 SecItemAdd
函数 在 Xcode 8/iOS 10模拟器中时 一直都是收到错误 -34018?
在 Xcode 8中创建一个新的 Single page 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。
自从 Beta 2在 iOS10模拟器中测试以来,Xcode 8中总是出现这种情况。
在 iOS 9.3模拟器中测试时,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 和 SecItemCopymatch 返回错误代码 -34018(errSecMissingEntitlement)中的 始终如一