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.