更新:この問題はXcode 8.2で修正されました。キーチェーンは、キーチェーンの共有を有効にしなくてもシミュレータで機能します。
Xcode 8 / iOS 10シミュレータで関数を呼び出すと、常にエラー-34018が発生するのはなぜですか?SecItemAdd
再現する手順
Xcode 8で新しいシングルページ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シミュレーターでテストする場合、ベータ2以降のXcode 8で常に発生します。
iOS 9.3シミュレーターでテストする場合、Xcode 8では発生しません。
デモ
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
参考文献
レーダー:https : //openradar.appspot.com/27422249
Apple開発者フォーラム:https : //forums.developer.apple.com/message/179846
この問題は、Xcode 8で一貫して発生するため、次の投稿とは異なります。SecItemAddおよびSecItemCopyMatchingがエラーコード-34018(errSecMissingEntitlement)を返す