업데이트 :이 문제는 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)을 반환합니다.
답변
권한 파일에 키 체인 액세스 그룹 을 추가하여 앱에서이 문제를 해결할 수있었습니다 . 테스트 앱 의 기능 섹션에서 키 체인 공유 스위치를 켰으며 저에게도 효과적입니다.
자격에 추가 할 항목 :
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>
macOS Sierra (10.12)에서만 시도 했으므로 10.11.5에서 작동하는지 확실하지 않습니다.
답변
에서 엑스 코드 8.1 GM 릴리스 노트 애플은 문제를 인정하고 깔끔한 해결 방법을 제안했다 :
자격 파일에 응용 프로그램 식별자 자격 값이 포함되어 있지 않으면 키 체인 API가 시뮬레이터에서 작동하지 않을 수 있습니다. (28338972) 해결 방법 : ENTITLEMENTS_REQUIRED라는 대상에 사용자 정의 빌드 설정을 추가하고 값을 YES로 설정합니다. 이렇게하면 Xcode가 빌드 할 때 자동으로 응용 프로그램 식별자 자격을 삽입합니다.
내가 시도한 것에서 Xcode 8.1에서만 작동합니다. 텍스트가 빌드 설정으로 오해 할 수 있지만,해야 할 일은 이것을 스킴의 환경 변수에 추가하는 것입니다.
Xcode 8.2는이 문제를 해결합니다.
Xcode 8.2 베타에서 해결됨-IDE 키 체인 API가 Simulator에서 올바르게 작동합니다. (28338972)
답변
답변
이메일로 서명하거나, 새 사용자를 만들거나, firebase를 사용하여 로그 아웃하는 동안 오류가 발생했습니다.
오류는 다음과 같습니다.
firauth 오류 도메인 코드 17995
테스트 앱의 기능 섹션에서 키 체인 공유 스위치를 켰으며 저에게도 효과적입니다.
답변
내가 찾던 기능이 아니기 때문에 키 체인 공유를 사용하지 않는 솔루션을 찾고있었습니다. 개발자 포럼 은 범위를 iOS 10 시뮬레이터로만 제한 할 수있는 EvergreenCoder에서 좋은 해결책을 가지고있는 것 같습니다 (이것이 유일한 영향을받는 시뮬레이터 인 것처럼 보임). 게시물에서 :
문제는 Xcode가 빌드 된 애플리케이션에 “application-identifier”엔 타일먼트를 제대로 추가하기 위해 적어도 하나의 인 타이틀먼트가 있어야한다는 것입니다. 이것이 키 체인 공유가 해결책 인 것처럼 보이지만 간접적으로 만 그렇습니다. 다른 권한이 제대로 작동하는 것 같습니다.
다음 .plist
과 같이 만들 수 있습니다 .
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-/
<plist version="1.0">
<dict>
<key>get-task-allow</key>
<true/>
</dict>
</plist>
빌드 설정에서 해당 파일의 경로를 제공하십시오.
Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file
게시물에서 언급했듯이이 인 타이틀먼트는 디버거를 연결할 수 있도록합니다.
답변
장치에서 실행하려고 할 때 -34018 오류가 발생했지만 비슷한 문제가 발생했습니다. iOS 10.1이 설치된 Sierra에서 XCode 8.1을 사용하고 있습니다. 저는 팀에서 일하고 있는데 프로젝트 설정에서 “자동으로 서명 관리”로 전환했을 때 갑자기이 문제가 발생했습니다. 이 기능을 끄고 수동으로 내 프로필을 선택하면 모든 것이 정상적으로 작동합니다. 결국 키 체인에서 개발자 인증서를 삭제 한 다음 “자동으로 서명 관리”를 다시 선택해야했습니다. 다음 빌드에서 새 서명 인증서가 생성되었으며 이제 모든 것이 정상적으로 작동합니다. 수동으로 선택하면 다른 인증서가 제대로 작동했지만 XCode에서 관리 할 때 문제의 원인이 무엇인지 여전히 잘 모르겠습니다. 이것이 다른 사람의 오랜 두통을 멈출 수 있기를 바랍니다.
답변
권한 조정없이 Xcode 11에서이 문제를 해결할 수있었습니다.
MyFrameworkTestsHostApp이라는 프레임 워크의 프로젝트에 새 앱 대상을 추가했습니다.
그런 다음 MyFrameworkTests 대상을 선택하고 호스트 응용 프로그램을 MyFrameworkTestsHostApp으로 선택했습니다.