업데이트 :이 문제는 Xcode 8.2에서 수정되었습니다. 키 체인은 키 체인 공유를 활성화하지 않고 시뮬레이터에서 작동합니다.
Xcode 8 / iOS 10 시뮬레이터에서 함수 를 호출 할 때 항상 오류 -34018이 발생하는 이유는 무엇 입니까?SecItemAdd
재현 단계
다음 코드 엑스 코드 8. 실행에 새로운 한 페이지 iOS 앱 프로젝트를 만듭니다 viewDidLoad
(또는 열 이 엑스 코드 프로젝트).
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)을 반환합니다.