2015-01-03 2 views
24

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

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

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

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.)" 
+0

http://stackoverflow.com/a/31421742/194544 – beryllium

ответ

34

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

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

+0

Какая работа лучше всего? Как вы это решили? – jonypz

+1

Интересно. На данный момент, похоже, не существует обходного пути. См. Комментарии инженера Apple здесь: https://forums.developer.apple.com/thread/4743 – coco

+1

В потоке @coco linked, Apple ответила 22 марта 2016 года, заявив, что они считают, что эта ошибка была исправлена ​​в iOS 9.3. –

2

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

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

Обратите внимание, что я могу воссоздать эту ошибку в основном потоке. – coco

3

Это держал меня за 2 часа, прежде чем я нашел быстро «исправить» - перезагрузить устройство IOS

Цитата из дискуссии на http://forums.developer.apple.com/thread/4743,

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

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

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

+1

В моем случае, когда я перезапускаю приложение, ошибка исчезла, что позволило мне продолжить тестирование. –

+0

Я отлаживал приложение iOS с AppCode & Xcode. Перезагрузка устройства решила проблему доступа к цепочке ключей! – leviathan

0

В соответствии с ответом @ iCaramba.Я нашел обходной путь:

  1. Остановить задачу, чтобы убить приложение (если вы уже используете приложение)
  2. Запустите приложение на устройстве вручную. НЕ используйте Xcode
  3. Используйте Xcode, чтобы повторно запустить приложение
4

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

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

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

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

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

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

22 марта 2016 3: 28 AM

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

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

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

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

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

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

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

Делите и наслаждайтесь

23

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

Activate KeychainShare ONenter image description here

+0

Хотел бы я дать вам куки-файлы для поиска этого. Я потратил много времени, чтобы проанализировать это. – Mahi

+0

В Италии это время завтрака, поэтому было бы очень признательно! – Zeb

+0

, который сделал трюк. XCode8. iOS10. – Alex

0

Я использую классы 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 в этой строке статическую LET accessGroup = "[ВАШ APP ID PREFIX] .com.example.apple-samplecode.GenericKeychainShared"

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