Cập nhật : Sự cố này đã được khắc phục trong Xcode 8.2. Chuỗi khóa hoạt động trong trình mô phỏng mà không cần bật chia sẻ chuỗi khóa.
Tại sao tôi luôn nhận được lỗi -34018 khi gọi SecItemAdd
chức năng trong trình mô phỏng Xcode 8 / iOS 10 ?
Các bước để tạo lại
Tạo một dự án ứng dụng iOS Trang đơn mới trong Xcode 8. Chạy mã sau trong viewDidLoad
(hoặc mở dự án Xcode này ).
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.")
}
Kết quả mong đợi
Mục được thêm vào Chuỗi khóa.
Kết quả thực tế
Chức năng SecItemAdd trả về mã lỗi sau: -34018
.
Phiên bản
Phiên bản Xcode 8.1 (8B62), macOS Sierra 10.12.1.
Cấu hình
Luôn xảy ra trong Xcode 8 kể từ Beta 2 khi thử nghiệm trong trình mô phỏng iOS 10.
KHÔNG xảy ra trong Xcode 8 khi thử nghiệm trong trình mô phỏng iOS 9.3.
Bản giới thiệu
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Người giới thiệu
Radar: https://openradar.appspot.com/27422249
Diễn đàn nhà phát triển Apple: https://forums.developer.apple.com/message/179846
Sự cố này khác với bài đăng sau vì nó xảy ra nhất quán trong Xcode 8. SecItemAdd và SecItemCopyMatching trả về mã lỗi -34018 (errSecMissingEntitlement)