Обновление : эта проблема исправлена в 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)
Ответы:
Я смог обойти это в своем приложении, добавив группы доступа Keychain в файл Entitlements. Я включил переключатель « Связка ключей» в разделе « Возможности » в вашем тестовом приложении, и он у меня тоже работает.
Элемент, который нужно добавить к правам:
Я пробовал это только на macOS Sierra (10.12), поэтому не уверен, сработает ли это для вас в 10.11.5.
источник
В примечаниях к выпуску Xcode 8.1 GM Apple признала проблему и предложила более чистый обходной путь:
Обратите внимание, что из того, что я пробовал, он работает только в Xcode 8.1. Хотя текст может ввести вас в заблуждение относительно настройки сборки, вам нужно добавить его в свои переменные среды в своей схеме.
Xcode 8.2 решит эту проблему:
источник
Это может произойти, если у вас есть тестовая цель, у которой нет хост-приложения. Исправить
добавить приложение фиктивного хоста:
Включите автоматическую подпись кода и добавьте команду:
источник
У меня возникла ошибка при подписании по электронной почте, создании нового пользователя или выходе из системы с помощью firebase.
Ошибка была:
Я включил переключатель «Связка ключей» в разделе «Возможности» в вашем тестовом приложении, и он у меня тоже работает.
источник
Я искал решение, в котором не использовалось бы совместное использование Связки ключей, поскольку это была не та функция, которую я искал. Форум разработчиков Похоже, у EvergreenCoder есть хорошая работа, которую вы можете ограничить только симулятором iOS 10 (поскольку это, кажется, единственный затронутый симулятор). Из сообщения:
Вы можете создать
.plist
подобное:и укажите путь к этому файлу в разделе "Параметры сборки" в
Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file
Как указано в сообщении, это право просто позволяет прикрепить отладчик.
источник
У меня была аналогичная проблема, хотя я получал ошибку -34018 при попытке запустить на устройстве. Я использую XCode 8.1 на Sierra с iOS 10.1. Я работаю в команде, и внезапно возникла эта проблема, когда мы перешли на «Автоматическое управление подпиской» в настройках проекта. Когда я выключаю это и вручную выбираю свой профиль, все работает нормально. В итоге мне пришлось удалить свой сертификат разработчика из моей связки ключей, а затем повторно выбрать «Автоматически управлять подписью». В следующей сборке он сгенерировал для меня новый сертификат подписи, и теперь все работает нормально. Я до сих пор не уверен, что вызвало проблему, поскольку другой сертификат работал нормально при выборе вручную, но не при управлении с помощью XCode. Надеюсь, это поможет остановить долгую головную боль у кого-то другого.
источник
Я смог решить эту проблему в Xcode 11 без каких-либо корректировок прав.
Я просто добавил новую цель приложения в свой проект фреймворка под названием MyFrameworkTestsHostApp.
Затем я выбрал цель MyFrameworkTests и выбрал для нее хост-приложение MyFrameworkTestsHostApp.
источник
Он работает после включения возможности совместного использования связки ключей.
источник
Есть 3 шага, которые нужно предпринять, чтобы быстро решить эту проблему.
Это сотворит чудо
источник