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. Я включил переключатель « Связка ключей» в разделе « Возможности » в вашем тестовом приложении, и он у меня тоже работает.

Скриншот включения переключателя

Элемент, который нужно добавить к правам:

<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 на реальном iPhone с iOS 9). Я заметил, что push-уведомления в возможностях нуждались в исправлении (т.е. нажатием кнопки), а также включил общий доступ к связке ключей, к сожалению, в то же время. Тогда приложение больше не получало ошибку. После повторного отключения Keychain Sharing он по-прежнему работает!
Стефан
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-интерфейсы связки ключей могут не работать в симуляторе, если ваш файл прав не содержит значения для прав на идентификатор приложения. (28338972) Обходной путь: добавьте определяемую пользователем настройку сборки к своей цели с именем ENTITLEMENTS_REQUIRED и установите значение YES. Это заставит Xcode автоматически вставлять разрешение идентификатора приложения при сборке.

Обратите внимание, что из того, что я пробовал, он работает только в Xcode 8.1. Хотя текст может ввести вас в заблуждение относительно настройки сборки, вам нужно добавить его в свои переменные среды в своей схеме.

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

Xcode 8.2 решит эту проблему:

Решено в бета-версии Xcode 8.2 - API-интерфейсы IDE Keychain корректно работают в Simulator. (28338972)

Тьяго Алмейда
источник
1
@Tiago Этот обходной путь из примечаний к выпуску все еще работает для вас в Xcode 8.1 на симуляторе iOS 10.1? Я пробовал добавить этот параметр (как параметр, определяемый пользователем для цели, так и в качестве переменной среды в схеме), и я все еще получаю возвращаемое значение -34018 при работе на симуляторах iOS 10.1.
guywithmazda 02
3
@guywithmazda, здесь то же самое. Все еще получаю -34018 и пробовал как настройки сборки, так и переменные среды.
keithbhunter 07
У меня не работает ни в настройках сборки, ни в качестве переменной окружения схемы в Xcode 8.1 (8B62) на Sierra. Я что-то упускаю?
Евгений
4
Я использую Xcode 8.2.1, и эта проблема все еще воспроизводима. Кроме того, мой вопрос: если у меня нет хост-приложения, и я создаю цель Framework, то как решить эту проблему?
DShah 02
2
Эта проблема по-прежнему влияет на модульные тесты для целей Framework, потому что в этом случае права требуются для заглушки тестового хоста. Нам известно о проблеме, но если она вам мешает, сообщите об ошибке-дубликате.
russbishop
10

Это может произойти, если у вас есть тестовая цель, у которой нет хост-приложения. Исправить

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

  2. Включите автоматическую подпись кода и добавьте команду:

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

  1. Включить совместное использование связки ключей в возможностях

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

Мустафа
источник
5

У меня возникла ошибка при подписании по электронной почте, создании нового пользователя или выходе из системы с помощью firebase.

Ошибка была:

код ошибки firauth 17995

Я включил переключатель «Связка ключей» в разделе «Возможности» в вашем тестовом приложении, и он у меня тоже работает.

Кавита Патель
источник
4

Я искал решение, в котором не использовалось бы совместное использование Связки ключей, поскольку это была не та функция, которую я искал. Форум разработчиков Похоже, у 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. Надеюсь, это поможет остановить долгую головную боль у кого-то другого.

Johnrechd
источник
1

Я смог решить эту проблему в Xcode 11 без каких-либо корректировок прав.

Я просто добавил новую цель приложения в свой проект фреймворка под названием MyFrameworkTestsHostApp.

Затем я выбрал цель MyFrameworkTests и выбрал для нее хост-приложение MyFrameworkTestsHostApp.

Адам Джонс
источник
0

Он работает после включения возможности совместного использования связки ключей.

Видео
источник
0

Есть 3 шага, которые нужно предпринять, чтобы быстро решить эту проблему.

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

Это сотворит чудо

Ученна Ннодим
источник