ios keychain keychainitemwrapper

El valor de escritura del llavero de iOS da como resultado un código de error-34018



keychain keychainitemwrapper (8)

Tengo una aplicación para iOS que almacena información confidencial en el llavero. Mientras escribo valores en el llavero, recibo el código de error -34018.

Actualmente estoy usando la clase KeyChainItemWrapper de iOS de Apple.

Las dos líneas de código siguientes reciben el mismo código de error.

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

Este problema no ocurre siempre, sino de manera intermitente. Una vez que recibo este error, ya no puedo escribir ningún valor en el llavero.

He impreso la descripción del error como tal:

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

Y esto es lo que el error imprime:

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


Asegúrese de que el intercambio de llavero debe estar activado en Capacidades en el proyecto Objetivo .

En mi caso, el archivo App_Name.entitlements tiene una ID de paquete diferente a la de mi ID de paquete de proyecto. Por lo tanto, cambio la ID del paquete en el archivo App_Name.entitlements a partir de mi ID del paquete del proyecto. por ejemplo, supongamos que su ID de paquete de proyecto es com.Apple.testApp luego llegó a

  1. Clave de apertura del archivo App_Name.entitlements clave Llaves de acceso de los grupos clave que es de tipo Array
  2. En item0, establezca el valor de su ID de paquete de proyecto como, por ejemplo: - $ (AppIdentifierPrefix) com.Apple.testAp.

Como han mencionado otros, este es un error de Llavero, uno que Apple conoce y ha tenido en cuenta al menos desde mediados de 2015.

A partir del 22 de marzo de 2016, sin embargo, Apple ha dicho:

Creemos que estos problemas fueron resueltos en iOS 9.3.

iOS 9.3 fue lanzado el 21 de marzo de 2016.

Consulte el hilo: forums.developer.apple.com/thread/4743

Para citar la respuesta de un empleado de Apple:

Mar 22, 2016 3:28 AM

OK, aquí está la última. Este es un problema complejo con múltiples causas posibles:

  • Algunas instancias del problema son causadas por la firma incorrecta de la aplicación. Puede distinguir fácilmente este caso porque el problema es 100% reproducible.

  • Algunas instancias del problema están causadas por un error en la forma en que iOS admite el desarrollo de aplicaciones (r. 23,991,853). Depurar esto se complicó por el hecho de que otro error en el sistema operativo (r. 23,770,418) enmascaró su efecto, lo que significa que el problema solo surgió cuando el dispositivo estaba bajo presión de memoria.

    Creemos que estos problemas fueron resueltos en iOS 9.3.

  • Sospechamos que puede haber más causas de este problema.

Por lo tanto, si ve este problema en un dispositivo de usuario (uno con el que Xcode no ha hablado) que ejecuta iOS 9.3 o posterior, presente un informe de error al respecto. Intente incluir el registro del sistema del dispositivo en su informe de error (me doy cuenta de que puede ser complicado al tratar con los dispositivos del cliente; una opción es pedirle al cliente que instale Apple Configurator, que les permite ver el registro del sistema). Y si presenta un error, publique su número de error, solo para el registro.

En nombre de Apple, me gustaría agradecer a todos por sus esfuerzos para ayudar a localizar este problema bastante horrible.

Comparte y Disfruta


Esto me detuvo durante 2 horas antes de encontrar una "solución" rápida: reiniciar el dispositivo iOS

Una cita de la discusión en http://forums.developer.apple.com/thread/4743 ,

Del usuario littledetails

Como han informado otros, este misterioso error de llavero es más fácilmente observable cuando se inicia a través de Xcode con el depurador adjunto. Una vez que comienza a producirse el error, el llavero no parece enderezarse independientemente de la presión de la memoria hasta que uno reinicia el dispositivo .

Cuando reinicié mi dispositivo, el error desapareció, permitiéndome continuar con las pruebas. No estoy seguro de qué más hacer. En mi situación, cambiarme a NSUserDefaults o alguna otra solución de almacenamiento no era una posibilidad.


Estoy usando las clases GenericKeychain de 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 }

En este archivo, estaba especificando mi grupo de acceso personalizado en esta línea estática, deje accessGroup = "[SU PREFIX DE APLICACIÓN] .com.example.apple-samplecode.GenericKeychainShared"

Después de regresar a static está accessGroup: String? = nil el problema se fue :)


Parece que esto es un error en Keychain, que solo aparece cuando inicias tu aplicación desde xcode. Consulte aquí: https://github.com/soffes/sskeychain/issues/52

Lo depuramos mucho y parece un problema acceder al llavero cuando la aplicación se inicia desde el fondo. Esto solo ocurre con el depurador (es decir, cuando se inicia desde Xcode). Creemos que el problema podría estar relacionado en nuestro caso con el depurador que mantiene viva la aplicación, incluso si el sistema operativo la elimina. De hecho, intentamos ejecutar la aplicación y luego ponerla en segundo plano y lanzar otra aplicación para ocupar la memoria RAM. Con el depurador, el error surgió al reanudar la aplicación desde el fondo, mientras que sin el depurador no lo hizo (ejecutamos al menos 10 pruebas cada uno).


Según la respuesta de @ iCaramba. He encontrado una solución:

  1. Detenga la tarea para eliminar la aplicación (si ya está ejecutando la aplicación)
  2. Inicie la aplicación en su dispositivo manualmente. NO use Xcode
  3. Usa Xcode para reiniciar la aplicación

Si alguien vuelve aquí con este error y XCode8 con iOS10 , probablemente tenga que habilitar KeyChain Share en la pestaña Capabilities :


Una forma de solucionar este problema con el llavero es usar dispatch_async para permitir que la aplicación se inicie. Esto funciona cuando la aplicación se abre desde el fondo. También asegúrese de tener la kSecAttrAccessibleAfterFirstUnlock accesibilidad kSecAttrAccessibleAfterFirstUnlock en el llavero.

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