Подтвердить что ты не робот

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, а не с фактическим оборудованием).

Зачем мне возвращать эту ошибку? Я не затронул ничего, относящееся к связанным с цепочкой связям частям приложения; он сохраняет и извлекает данные точно так же, как и раньше.

4b9b3361

Ответ 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() для доступа к общей цепочке ключей, этих двух параметров не должно быть.