Güncelleme : Bu sorun Xcode 8.2'de düzeltilmiştir. Anahtarlık, simülatörde, anahtar zinciri paylaşımını etkinleştirmeden çalışır.
Xcode 8 / iOS 10 simülatöründe işlevi çağırırken neden her zaman -34018 hatası alıyorum ?SecItemAdd
Yeniden Üretme Adımları
Xcode 8'de yeni bir Tek sayfalı iOS uygulama projesi oluşturun. Aşağıdaki kodu içinde çalıştırın viewDidLoad
(veya bu Xcode projesini açın ).
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.")
}
Beklenen sonuçlar
Öğe, Anahtar Zincirine eklenir.
Fiili sonuç
Fonksiyon SecItemAdd aşağıdaki hata kodunu döndürür: -34018
.
Sürüm
Xcode sürüm 8.1 (8B62), macOS Sierra 10.12.1.
Yapılandırma
Bir iOS 10 simülatöründe test yaparken Beta 2'den beri her zaman Xcode 8'de gerçekleşir.
Bir iOS 9.3 simülatöründe test yaparken Xcode 8'de OLUŞMAZ.
Demo
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Referanslar
Radar: https://openradar.appspot.com/27422249
Apple Geliştirici Forumları: https://forums.developer.apple.com/message/179846
Bu sorun, Xcode 8'de tutarlı bir şekilde meydana geldiğinden aşağıdaki gönderiden farklıdır . SecItemAdd ve SecItemCopyMatching, -34018 hata kodunu döndürüyor (errSecMissingEntitlement)