Aktualizacja : ten problem został rozwiązany w Xcode 8.2. Pęk kluczy działa w symulatorze bez włączania udostępniania pęku kluczy.
Dlaczego zawsze otrzymuję błąd -34018 podczas wywoływania SecItemAdd
funkcji w symulatorze Xcode 8 / iOS 10 ?
Kroki ku reprodukcji
Utwórz nowy projekt aplikacji dla systemu iOS z pojedynczą stroną w Xcode 8. Uruchom następujący kod w viewDidLoad
(lub otwórz ten projekt 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.")
}
oczekiwane rezultaty
Przedmiot został dodany do pęku kluczy.
Aktualne wyniki
Funkcja SecItemAdd zwraca następujący kod błędu: -34018
.
Wersja
Xcode w wersji 8.1 (8B62), macOS Sierra 10.12.1.
Konfiguracja
Zawsze występuje w Xcode 8 od wersji Beta 2 podczas testowania w symulatorze iOS 10.
NIE występuje w Xcode 8 podczas testowania w symulatorze iOS 9.3.
Próbny
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Bibliografia
Radar: https://openradar.appspot.com/27422249
Fora deweloperów Apple: https://forums.developer.apple.com/message/179846
Ten problem różni się od następującego postu, ponieważ występuje konsekwentnie w Xcode 8. SecItemAdd i SecItemCopyMatching zwraca kod błędu -34018 (errSecMissingEntitlement)