IOS Keychain SecItemAdd возвращает -25243
Я работаю над обновлением приложения iPhone с незначительным изменением его конфигурации по умолчанию. Прошло некоторое время с тех пор, как я его построил последним, и поэтому я обновил Xcode до 4.2 и включил поддержку iOS 5 в последних сборках.
Когда я иду на тестирование на устройстве, я получаю следующую ошибку утверждения:
2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.'
Я использую реализацию класса KeychainItemWrapper
из Apple проекта GenericKeychain. Стоит отметить, что эта ошибка появляется только на устройстве, а не в Simulator (и я знаю различия в ограничениях группы доступа между платформами, но обычно я думал, что это вызвало проблемы с Simulator, а не с фактическим оборудованием).
Зачем мне возвращать эту ошибку? Я не затронул ничего, относящееся к связанным с цепочкой связям частям приложения; он сохраняет и извлекает данные точно так же, как и раньше.
Ответы
Ответ 1
Хорошо, я не мог получить ваш проект, но из Как делиться данными о связях с ключами между приложениями iOS. Я думаю, вы можете проверить свой файл прав, По крайней мере, в проекте github у вас не было ничего определенного в группах доступа Keychain.
Ответ 2
Для будущих поисковиков, которые, случается, заканчиваются здесь, на симуляторе запускается другая возможная причина ошибки -25243 (что означает No access control
, BTW).
Моя лучшая теория - профиль создания приложения (или его подпись) - это то, как приложение знает, что такое его семя. И семя пакета должно быть частью имени вашей группы ключей. Но приложения, запущенные на симуляторе, не подписываются, и поэтому у вас есть недостающее (или другое?) Семя, чем указано keychain-access-group
.
Или что-то. Все это настолько плохо документировано, что трудно сказать, что. Просто попробуйте запустить его на устройстве и посмотреть, помогает ли это.
Ответ 3
Для тех из вас, кто получает эту ошибку и пытается достичь "совместного доступа к цепочке ключей" между двумя приложениями:
Вам нужно создать идентификатор приложения для вашего приложения с тем же идентификатором команды, который вы выбрали, когда вы впервые активировали "Общий доступ к брелокам" в "Возможности". Создайте свой идентификатор приложения здесь:
Центр пользователей Apple
После этого вам нужно создать профиль обеспечения из этого идентификатора приложения и загрузить его на свой компьютер (дважды щелкните его, чтобы установить его в x-код)
Я предполагаю, что вы уже знаете, что вам нужен "Префикс идентификатора приложения" для доступа к цепочке ключей, но для тех, кто не знает:
"Префикс идентификатора приложения" - это уникальный текстовый идентификатор, связанный с вашей учетной записью разработчика Apple: ![введите описание изображения здесь]()
Чтобы получить доступ к "SharedKeychain", вам необходимо реализовать его так, как прежде, чем попытаться написать или прочитать из связки ключей
keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"
:
Вы можете проверить этот учебник для получения дополнительной информации: Разделите брелок между приложениями iOS
Надеюсь, что это поможет.
Ответ 4
Я получаю ту же ошибку время от времени в симуляторе, даже если я не касался кода. A reset симулятора решает проблему для меня.
См. этот вопрос/ответ, как reset симулятор: fooobar.com/questions/59499/...
Ответ 5
Как отмечали другие, в строках устройств ошибка -25243 часто вызвана попыткой доступа к группе доступа к цепочке ключей, для которой у вас нет разрешений. (Он отсутствует в вашем файле Entitlements.plist или в профиле обеспечения.)
Но в симуляторе может быть и другая причина. Симулятор не поддерживает группы доступа к цепочке ключей, поэтому, если вы установите свойство kSecAttrAccessGroup
на элемент keychain и попытаетесь записать его, вы получите код ошибки -25243.
FYI, Apple GenericKeychain в следующем примере кода кода:
// Ignore the access group if running on the iPhone simulator.
//
// Apps that are built for the simulator aren't signed, so there no keychain access group
// for the simulator to check. This means that all apps can see all keychain items when run
// on the simulator.
//
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the
// simulator will return -25243 (errSecNoAccessForItem).
Ответ 6
Это работало для меня, когда я использовал производственный сертификат и профиль подготовки. Использование debug не работает.
Ответ 7
По моему опыту, я получаю это возвращаемое значение -25243
, когда понял, что пытаюсь передать kSecMatchLimit
с kSecMatchLimitOne
и kSecReturnData
с kCFBooleanTrue
значениями в функцию SecItemAdd()
. Я удалил их и дважды проверял идентификаторы приложений и профили подготовки, и все хорошо.
Я не уверен, что это полезно или нет, но по моему опыту, если вы будете использовать функцию SecItemAdd()
для доступа к общей цепочке ключей, этих двух параметров не должно быть.