อัปเดต : ปัญหานี้ได้รับการแก้ไขแล้วใน Xcode 8.2 พวงกุญแจทำงานในโปรแกรมจำลองโดยไม่เปิดใช้งานการแชร์พวงกุญแจ
เหตุใดฉันจึงมักจะได้รับข้อผิดพลาด -34,018 เมื่อเรียกSecItemAdd
ฟังก์ชั่นใน Xcode 8 / iOS 10 จำลอง ?
ขั้นตอนในการทำซ้ำ
สร้างหน้าเดี่ยว iOS ของโครงการ app ใหม่ใน Xcode 8. การเรียกใช้รหัสต่อไปนี้ใน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
การกำหนดค่า
เกิดขึ้นใน Xcode 8 เสมอตั้งแต่ Beta 2 เมื่อทดสอบในโปรแกรมจำลอง iOS 10
ไม่เกิดขึ้นใน Xcode 8 เมื่อทดสอบในโปรแกรมจำลอง iOS 9.3
การสาธิต
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)