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

Значение записи в IOS Keychain приводит к ошибке кода -34018

У меня есть приложение iOS, в котором хранится некоторая конфиденциальная информация в цепочке ключей. При записи значений в цепочку ключей я получаю код ошибки -34018.

В настоящее время я использую класс Apple iOS KeyChainItemWrapper.

Обе следующие строки кода получают одинаковый код ошибки.

OSStatus res1 = SecItemCopyMatching((__bridge CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes);
OSStatus res = SecItemUpdate((__bridge CFDictionaryRef)updateItem, (__bridge CFDictionaryRef)tempCheck);

Эта проблема не возникает каждый раз, но с перерывами. Как только я получу эту ошибку, я больше не могу писать какие-либо значения в цепочку ключей.

Я напечатал описание ошибки следующим образом:

NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:res userInfo:nil];

и это то, что выдает ошибка:

Error: Error Domain=NSOSStatusErrorDomain Code=-34018 "The operation couldn’t be completed. (OSStatus error -34018.)"
4b9b3361

Ответ 1

Похоже, что это ошибка в Keychain, которая появляется только при запуске приложения из xcode. См. Здесь: https://github.com/soffes/sskeychain/issues/52

Мы отлаживали его много, и, похоже, проблема связана с цепочкой ключей, когда приложение запускается из фона. Это происходит только с отладчик (т.е. при запуске из Xcode). Мы считаем, что проблема может быть связано в нашем случае с отладчиком, поддерживающим приложение даже если он должен быть убит ОС. Мы попытались на самом деле запустить приложение, а затем положить его в фоновом режиме и запустить много других приложений, чтобы занять ОЗУ. С отладчиком ошибка возникла при возобновлении приложения из фон, в то время как без отладчика это не было (мы выполнили хотя бы 10 тестов каждый).

Ответ 2

Если кто-то придет сюда с этой ошибкой и XCode8 с iOS10, возможно, вам нужно включить KeyChain Share на вкладке Capabilities:

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

Ответ 3

Как уже упоминалось, это ошибка Keychain, о которой Apple знает и знает об этом, по крайней мере, с середины 2015 года.

По состоянию на 22 марта 2016 года Apple заявила:

Мы считаем, что эти проблемы были решены в IOS 9.3.

iOS 9.3 был выпущен 21 марта 2016 года.

Смотрите поток: https://forums.developer.apple.com/thread/4743

Чтобы процитировать ответ сотрудника Apple:

Mar 22, 2016 3:28 AM

Хорошо, последнее. Это сложная проблема с несколькими возможными причинами:

  • Некоторые примеры проблемы вызваны неправильной подпиской на приложение. Вы можете легко отличить этот случай, потому что проблема на 100% воспроизводима.

  • Некоторые примеры проблемы вызваны ошибкой в ​​том, как iOS поддерживает разработку приложений (т. 23, 991, 853). Отладка этого была осложнена тем, что другая ошибка в ОС (т. 23,770,418) замаскировала ее эффект, а это означало, что проблема возникла только тогда, когда устройство находилось под давлением памяти.

    Мы считаем, что эти проблемы были решены в iOS 9.3.

  • Мы подозреваем, что может возникнуть еще больше причин этой проблемы.

Итак, если вы видите эту проблему на пользовательском устройстве (которое не поддерживалось Xcode), которое работает под управлением iOS 9.3 или новее, сделайте файл с сообщением об ошибке. Попробуйте включить системный журнал устройства в отчет об ошибке (я понимаю, что это может быть сложно при работе с клиентскими устройствами, один из них - попросить клиента установить Apple Configurator, который позволяет им просматривать системный журнал). И если вы делаете файл с ошибкой, отправьте свой номер ошибки, только для записи.

От имени Apple Id хотелось бы поблагодарить всех за их усилия по поиску этой довольно ужасной проблемы.

Поделиться и наслаждаться

Ответ 4

Это заставило меня за 2 часа до того, как я нашел быстрое "исправление" - перезагрузите устройство iOS

Цитата из обсуждения на http://forums.developer.apple.com/thread/4743,

От пользователя littledetails

Как сообщали другие, эта загадочная ошибка в цепочке ключей наиболее легко просматривается при запуске через Xcode с прикрепленным отладчиком. Как только ошибка начинается, брелок не кажется правильным, независимо от давления памяти , пока не перезагрузится устройство.

Когда я перезагрузил свое устройство, ошибка исчезла, позволив мне продолжить тестирование. Не уверен, что еще делать. В моей ситуации переход на NSUserDefaults или какое-либо другое решение для хранения не было возможным.

Ответ 5

Один из способов обойти эту проблему с помощью keychain - использовать dispatch_async, чтобы приложение могло запускаться. Это работает, когда приложение открывается из фона. Также убедитесь, что у вас есть параметр доступности kSecAttrAccessibleAfterFirstUnlock на цепочке ключей.

 dispatch_async(dispatch_get_main_queue(), ^{
    // save/write to keychain
 })

Ответ 6

По ответам @iCaramba. Я нашел обходное решение:

  • Остановить задачу, чтобы убить приложение (если вы уже используете приложение)
  • Запустите приложение на своем устройстве вручную. НЕ используйте Xcode
  • Используйте Xcode для перезапуска приложения

Ответ 7

Я использую классы GenericKeychain из apple:

https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797-Intro-DontLinkElementID_2

struct KeychainConfiguration {

static let serviceName = "MyAppService"



/*

    Specifying an access group to use with `KeychainPasswordItem` instances will create items shared accross both apps.



    For information on App ID prefixes, see:

        https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/AppID.html
    and:
        https://developer.apple.com/library/ios/technotes/tn2311/_index.html
*/

//    static let accessGroup = "[YOUR APP ID PREFIX].com.example.apple-samplecode.GenericKeychainShared"



/*

    Not specifying an access group to use with `KeychainPasswordItem` instances

    will create items specific to each app.

*/

static let accessGroup: String? = nil

}

В этом файле я указывал свою собственную группу accessGroup в этой строке static let accessGroup = "[YOUR APP ID PREFIX].com.example.apple-samplecode.GenericKeychainShared"

После возврата в static let accessGroup: String? = nil проблема исчезла.:)