SecItemAdd는 iOS 10 시뮬레이터의 Xcode 8에서 항상 오류 -34018을 반환합니다.


103

업데이트 :이 문제는 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)을 반환합니다.


8
이것은 Xcode 8 GM에서 여전히 문제인 것으로 보입니다. 멋진 애플이 ... 그들의 게임의 상단에 여전히 볼
— 니콜라스 Harlen

1
나를 위해 같은, 여전히이 오류
— Kostiantyn 코발

난 정말 당신의 콘솔 로그 :-) 파고 있어요
— 니콜라스 미아리을

이 문제는 Xcode 8.2에서 수정되었지만 Xcode 9.0에서 돌아 왔습니다!
— Adil Hussain

답변:


183

권한 파일에 키 체인 액세스 그룹 을 추가하여 앱에서이 문제를 해결할 수있었습니다 . 테스트 앱 의 기능 섹션에서 키 체인 공유 스위치를 켰으며 저에게도 효과적입니다.

스위치 켜기 스크린 샷

자격에 추가 할 항목 :

<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>

macOS Sierra (10.12)에서만 시도 했으므로 10.11.5에서 작동하는지 확실하지 않습니다.


여기서도 동일합니다. 현재 Xcode 8 베타 5를 사용하고 있습니다 (iOS 10 시뮬레이터 포함. 이전 베타에서는 문제가 나타나지 않았습니다. 실제 iOS 9 iPhone에서 8b5로 테스트 할 때도 발생하지 않음). 기능의 푸시 알림이 수정 (즉, 버튼 누르기)이 필요하다는 것을 알았고, 안타깝게도 동시에 키 체인 공유를 켰습니다. 그런 다음 앱에서 더 이상 오류가 발생하지 않았습니다. 켠 후 떨어져 다시 키 체인 공유, 그것은 여전히 작동!
— Stefan

2
키 체인을 테스트 대상으로 사용했는데 실패했습니다.이 문제를 어떻게 해결할 수 있습니까? (테스트 대상에는 기능이 없기 때문에)
— 샘 저먼은

1
@ SamJarman 나도이 문제가 있었다. 방금 테스트 대상에 대한 빌드 설정으로 이동하여 자격 필드를 설정 해제했습니다. 그 후 잘 작동했습니다.
— Jordan Bondo

3
이 솔루션은 앱 타겟에 적합합니다. 불행히도 저는 오류로 인해 더 이상 빌드되지 않는 KeychainSwift 를 사용하는 Swift 프레임 워크를 작업 중입니다 . 프레임 워크 대상에서 권한 파일 afaik을 추가 할 수 없습니다. 누구든지이 경우에 대한 해결 방법을 알고 있습니까?
— Jan Nash

5
@JanNash, 여기에 테스트 작업을 수행하는 방법이 있습니다. evgenii.com/blog/testing-a-keychain-library-in-xcode
— Evgenii

17

에서 엑스 코드 8.1 GM 릴리스 노트 애플은 문제를 인정하고 깔끔한 해결 방법을 제안했다 :

자격 파일에 응용 프로그램 식별자 자격 값이 포함되어 있지 않으면 키 체인 API가 시뮬레이터에서 작동하지 않을 수 있습니다. (28338972) 해결 방법 : ENTITLEMENTS_REQUIRED라는 대상에 사용자 정의 빌드 설정을 추가하고 값을 YES로 설정합니다. 이렇게하면 Xcode가 빌드 할 때 자동으로 응용 프로그램 식별자 자격을 삽입합니다.

내가 시도한 것에서 Xcode 8.1에서만 작동합니다. 텍스트가 빌드 설정으로 오해 할 수 있지만,해야 할 일은 이것을 스킴의 환경 변수에 추가하는 것입니다.

여기에 이미지 설명 입력

Xcode 8.2는이 문제를 해결합니다.

Xcode 8.2 베타에서 해결됨-IDE 키 체인 API가 Simulator에서 올바르게 작동합니다. (28338972)


1
@Tiago 릴리스 정보의이 해결 방법이 iOS 10.1 시뮬레이터의 Xcode 8.1에서 여전히 작동합니까? 이 설정 (대상에 대한 사용자 정의 설정 및 구성표의 환경 변수)을 추가하려고 시도했지만 iOS 10.1 시뮬레이터에서 실행할 때 여전히 -34018 반환 값을 얻습니다.
— guywithmazda

3
@guywithmazda, 여기도 마찬가지입니다. 여전히 -34018을 얻고 빌드 설정과 환경 변수를 모두 시도했습니다.
— keithbhunter 2016

나를 위해 작동하지 않으며, 빌드 설정이나 Sierra의 Xcode 8.1 (8B62)에서 구성표의 환경 변수로 작동하지 않습니다. 내가 뭔가를 놓치고 있습니까?
— Evgenii

4
Xcode 8.2.1을 사용하고 있으며이 문제는 여전히 재현 가능합니다. 또한 내 질문은 호스트 앱이없고 프레임 워크 대상을 만드는 경우이 문제를 해결하는 방법입니다.
— DShah

2
이 문제는 여전히 프레임 워크 대상에 대한 단위 테스트에 영향을줍니다.이 경우 자격이 필요한 테스트 호스트 스텁이되기 때문입니다. 우리는 문제를 알고 있지만 그것이 당신을 차단하는 경우 중복 버그를 제출하십시오.
— russbishop

10

이는 호스트 앱이없는 테스트 대상이있는 경우 발생할 수 있습니다. 고치다

  1. 더미 호스트 앱 추가 : 여기에 이미지 설명 입력

  2. 자동 코드 서명을 활성화하고 팀을 추가합니다.

여기에 이미지 설명 입력

  1. 기능에서 키 체인 공유 활성화

여기에 이미지 설명 입력


5

이메일로 서명하거나, 새 사용자를 만들거나, firebase를 사용하여 로그 아웃하는 동안 오류가 발생했습니다.

오류는 다음과 같습니다.

firauth 오류 도메인 코드 17995

테스트 앱의 기능 섹션에서 키 체인 공유 스위치를 켰으며 저에게도 효과적입니다.


4

내가 찾던 기능이 아니기 때문에 키 체인 공유를 사용하지 않는 솔루션을 찾고있었습니다. 개발자 포럼 은 범위를 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

게시물에서 언급했듯이이 인 타이틀먼트는 디버거를 연결할 수 있도록합니다.


1

장치에서 실행하려고 할 때 -34018 오류가 발생했지만 비슷한 문제가 발생했습니다. iOS 10.1이 설치된 Sierra에서 XCode 8.1을 사용하고 있습니다. 저는 팀에서 일하고 있는데 프로젝트 설정에서 "자동으로 서명 관리"로 전환했을 때 갑자기이 문제가 발생했습니다. 이 기능을 끄고 수동으로 내 프로필을 선택하면 모든 것이 정상적으로 작동합니다. 결국 키 체인에서 개발자 인증서를 삭제 한 다음 "자동으로 서명 관리"를 다시 선택해야했습니다. 다음 빌드에서 새 서명 인증서가 생성되었으며 이제 모든 것이 정상적으로 작동합니다. 수동으로 선택하면 다른 인증서가 제대로 작동했지만 XCode에서 관리 할 때 문제의 원인이 무엇인지 여전히 잘 모르겠습니다. 이것이 다른 사람의 오랜 두통을 멈출 수 있기를 바랍니다.


1

권한 조정없이 Xcode 11에서이 문제를 해결할 수있었습니다.

MyFrameworkTestsHostApp이라는 프레임 워크의 프로젝트에 새 앱 대상을 추가했습니다.

그런 다음 MyFrameworkTests 대상을 선택하고 호스트 응용 프로그램을 MyFrameworkTestsHostApp으로 선택했습니다.


0

기능에서 키 체인 공유를 활성화 한 후에 작동합니다.


0

이 문제를 신속하게 해결하려면 3 단계를 거쳐야합니다.

  1. 프로젝트 기능에서 키 체인 공유를 켭니다.
  2. 프로필을 사용하여 자동 프로비저닝 선택
  3. 사용자 지정 자격 옵션이 Entitlement.plist로 설정되어 있는지 확인합니다.

이것은 마법을 할 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.