SecItemAdd завжди повертає помилку -34018 в Xcode 8 в тренажері iOS 10


103

Оновлення : Ця проблема виправлена ​​в Xcode 8.2. Брелок працює в тренажері без включення спільного використання брелоків.

Чому я завжди отримую помилку -34018 при виклику SecItemAddфункції в симуляторі Xcode 8 / iOS 10 ?

Кроки до відтворення

Створіть новий проект програми iOS для однієї сторінки в Xcode 8. Запустіть наступний код у viewDidLoad(або відкрийте цей проект 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.")
}

очікувані результати

Елемент додається до брелка.

Фактичні результати

Функція SecItemAdd повертає наступний код помилки: -34018.

Версія

Версія Xcode 8.1 (8B62), macOS Sierra 10.12.1.

Конфігурація

Завжди зустрічається в Xcode 8 з Beta 2 при тестуванні в тренажері iOS 10.

НЕ трапляється в Xcode 8 при тестуванні в тренажері iOS 9.3.

Демо

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. Приємно бачити, що Apple все ще перебуває на вершині їхньої гри ...
Ніколас Харлен

1
те саме для мене, як і раніше ця помилка
Костянтин Коваль

Я справді
копаю

Проблема була виправлена ​​в Xcode 8.2, але вона знову в Xcode 9.0!
Аділь Хуссей

Відповіді:


183

Мені вдалося обійти цю проблему у своєму додатку, додавши групи доступу Keychain до файлу Entitlements. Я включив брелок Sharing перемикач в потенціалі розділу в тестовому додатку, і це працює для мене.

Знімок екрана включення вимикача

Елемент, який потрібно додати до прав:

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

Я спробував це лише на macOS Sierra (10.12), тому я не впевнений, чи спрацює він для вас 10.11.5.


Те саме тут, лише те, що я зараз використовую Xcode 8 beta 5 (з тренажером iOS 10. Проблема не з’явилася з попередньою бета-версією. Також не буває при тестуванні з 8b5 на реальному iOS 9 iPhone). Я помітив, що Push Notifications in Capability потребує виправлення (тобто натискання кнопки), а також увімкнув спільний доступ до брелоків, на жаль, одночасно. Тоді додаток більше не отримував помилки. Після вимкнення спільного використання брелка, він все ще працює!
Стефан

2
Я використовую брелок для тестової цілі, і він не спрацьовує - як мені це обійти? (Оскільки у тестових цілей немає можливостей)
Сем Джарман

1
@SamJarman У мене теж була ця проблема. Я щойно перейшов до налаштувань збірки для тестової цілі та скасував поле прав. Після цього добре працював.
Джордан Бондо

3
Це рішення добре працює для цілей додатків. На жаль, я працюю над рамкою Swift, яка використовує KeychainSwift, який більше не створюється через помилку. У рамковій цілі я не можу додати файл файлів afaik. Хтось знає вирішення цього випадку?
Ян Неш

5
@JanNash, ось як мені вдалося зробити тестувальну роботу evgenii.com/blog/testing-a-keychain-library-in-xcode
Євгеній

17

У Xcode 8.1 Примітки до випуску GM Apple визнала проблему та запропонувала більш чітке рішення:

API Keychain можуть не працювати в Simulator, якщо файл ваших прав не містить значення для права на ідентифікатор програми. (28338972) Обхід: Додайте призначене користувачем налаштування для цілі під назвою ENTITLEMENTS_REQUIRED та встановіть значення YES. Це призведе до того, що Xcode автоматично вставляє права на ідентифікатор програми під час створення.

Зауважте, що з того, що я спробував, він працює лише в Xcode 8.1. Хоча текст може ввести вас в оману в налаштуваннях збірки, все, що вам потрібно зробити, - це додати це до змінних навколишнього середовища у вашій схемі.

введіть тут опис зображення

Xcode 8.2 вирішить це:

Розв’язані в Xcode 8.2 beta - API IDE Keychain правильно працюють в Simulator. (28338972)


1
@Tiago Це вирішення з нотаток до випуску все ще працює для вас у Xcode 8.1 на тренажері iOS 10.1? Я спробував додати цей параметр (як налаштований користувачем ціль, так і як змінна середовища в схемі), і я все одно отримую -34018 повернутого значення під час роботи на тренажерах iOS 10.1.
guywithmazda

3
@guywithmazda, тут же. Все ще отримуєте -34018 і спробували як налаштування, так і змінні середовища.
keithbhunter

Не працює для мене ні в налаштуваннях збірки, ні як екологічна змінна схема схеми в Xcode 8.1 (8B62) на Sierra. Я щось пропускаю?
Євгеній

4
Я використовую Xcode 8.2.1, і ця проблема все ще відтворюється. Крім того, у мене питання, якщо у мене немає хост-програми, і я створюю рамкову ціль, то як вирішити цю проблему?
DShah

2
Ця проблема як і раніше впливає на тестування одиниць для цілей Framework, оскільки в цьому випадку потрібна права доступу до тестового вузла. Нам відомо про цю проблему, але якщо це блокатор, будь ласка, подайте копію помилки.
єпископ

10

Це може статися, якщо у вас є тестова ціль, яка не має хост-програми. Виправити

  1. додати фіктивну програму хоста: введіть тут опис зображення

  2. Увімкнути автоматичне підписання коду та додати команду:

введіть тут опис зображення

  1. Увімкніть обмін брелоками в можливостях

введіть тут опис зображення


5

Я отримав помилку під час підписання електронною поштою, створення нового користувача або виходу за допомогою firebase.

Помилка:

код домену помилки firauth 17995

Увімкнув перемикач обміну брелками у розділі «Можливості» у вашому тестовому додатку, і він працює для мене.


4

Я шукав рішення, яке не використовувало обмін Keychain, оскільки це була не особливість, яку я шукав. Форум розробників, здається, добре розібрався з EvergreenCoder, що ви можете обмежитися за обсягом лише симулятором iOS 10 (оскільки, здається, це єдиний пошкоджений симулятор). З поста:

Здається, проблема полягає в тому, що має бути принаймні одне право для того, щоб Xcode правильно додав вбудовану програму вкладеного "ідентифікатора програми". Ось чому спільне використання брелоків здається вирішенням, але це лише побічно: будь-яке інше право, здається, працює нормально.

Ви можете створити .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. Я використовую XCode 8.1 на Sierra з iOS 10.1. Я працюю над командою, і раптом у мене виникло це питання, коли ми перейшли в налаштування проекту «Автоматично керувати підписом». Коли я вимикаю це і вручну вибираю профіль, все працює добре. Мені довелося видалити мій сертифікат розробника з моєї брелки, а потім повторно вибрати «Автоматично керувати підписом». Під час наступної збірки він створив для мене новий сертифікат підписання, і все працює нормально. Я все ще не впевнений, що спричинило проблему, оскільки інший сертифікат працював нормально, коли вибирався вручну, але не тоді, коли керував XCode. Сподіваюсь, це допомагає зупинити головний біль у когось іншого.


1

Мені вдалося вирішити цю проблему в Xcode 11 без будь-яких коригувань прав.

Я просто додав нову ціль програми до проекту моєї рамки під назвою MyFrameworkTestsHostApp.

Тоді я вибрав ціль MyFrameworkTests і обрав її хост-додаток як MyFrameworkTestsHostApp.


0

Він працює після ввімкнення обміну брелками у можливостях.


0

Для вирішення цієї проблеми потрібно три кроки.

  1. Увімкніть обмін брелоком у можливостях проекту.
  2. Виберіть Автоматичне надання за допомогою профілю
  3. Переконайтеся, що для параметра користувальницьких прав встановлено Entitlement.plist.

Це зробить магію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.