ios objective-c ios9 keychain

ios - Código de error OSStatus-34018



objective-c ios9 (4)

Después de algunas investigaciones, encontré esto: http://opensource.apple.com/source/Security/Security-55471/sec/Security/SecBasePriv.h

Entonces -34018 es errSecMissingEntitlement y el comentario dice

Internal error when a required entitlement isn''t present.

¿Experimenta este error al ejecutar las pruebas de su unidad? De ser así, esto podría ayudar: https://stackoverflow.com/a/22305193/171933

Este problema en github dice que solo parece suceder mientras se depura de Xcode: https://github.com/soffes/sskeychain/issues/97 (también vea https://stackoverflow.com/a/28256591/171933 )

¡Espero que algo de esto ayude!

Estoy utilizando SecItemCopyMatching para acceder al llavero de iOS. Aproximadamente 1 de cada 100 veces obtengo un código de resultado de -34018 justo después de relanzar la aplicación desde el fondo. La documentación dice:

El espacio de error asignado para Keychain Services es discontinuo: de -25240 a -25279 y de -25290 a -25329. Keychain Item Services también puede devolver noErr (0) o paramErr (-50), o códigos de resultado de CSSM

Entonces parece que -34018 es un ''código de resultado CSSM''. Seguí el enlace sugerido pero no pude encontrar los códigos de resultado.

¿Cuál es el código de resultado -34018 ? ¿Cómo puedo obtener acceso a un llavero más confiable?

- (NSData *)getKeychainData:(NSString *)key { NSDictionary *query = @{ (__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService:SEC_ATTR_SERVICE, (__bridge id)kSecAttrAccount:key, (__bridge id)kSecReturnData:@YES }; CFDataRef result = nil; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result); if(status == errSecItemNotFound) { return nil; } if(status == noErr) { return CFBridgingRelease(result); } else { [self logError:[NSString stringWithFormat:@"SecItemCopyMatching status %d", (int)status] :nil]; return nil; } }


Después de probar muchas de las correcciones en el desbordamiento de la pila, las cosas todavía no me funcionaban.

Lo que funcionó fue cambiar la Capacidad de Compartir Llavero en Xcode. Construido y funciona y funcionó de inmediato.


Este código funciona para mí:

static const UInt8 kKeychainItemIdentifier[] = "com.apple.dts.KeychainUI/0"; - (NSData *)getKeychainData:(NSString *)key { NSData *keychainItemID = [NSData dataWithBytes:kKeychainItemIdentifier length:strlen((const char *)kKeychainItemIdentifier)]; NSDictionary *query = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService: SEC_ATTR_SERVICE, (__bridge id)kSecAttrAccount: key, (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrGeneric: keychainItemID }; CFDataRef result = NULL; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result); if(status == errSecItemNotFound) { return nil; } if(status == noErr) { return CFBridgingRelease(result); } else { [self logError:[NSString stringWithFormat:@"SecItemCopyMatching status %d", (int)status] :nil]; return nil; } }

La principal diferencia con el código de OP es la adición de un Atributo Genérico a la consulta. El Identificador de artículo de llavero es el predeterminado de Apple. La razón detrás de esto viene a diferenciar posibles elementos diferentes de llavero entre sí. Esta es una forma de hacer que los artículos de llavero sean más confiables. Básicamente, en otras palabras, esto asegura que tengas acceso al llavero predeterminado de apple.


Solo he estado investigando el mismo error.

La esencia de esto es que el servicio de seguridad que Apple utiliza para comunicarse con el llavero, en casos raros, cuando el dispositivo del usuario tiene poca memoria, se cuelga y le quita la capacidad de la aplicación para hablar con el llavero, lo que resulta terrible: 34018.

Esto no ocurre solo cuando se ejecuta a través de Xcode como algunos pueden reclamar.

Estos son los datos más recientes sobre el tema tomados de los foros de desarrolladores de Apple por uno de los empleados de Apple:

ACTUALIZACIÓN: finalmente hemos podido reproducir el error -34018 en iOS 8.3. Este es el primer paso para identificar la causa raíz y luego encontrar una solución.

Como de costumbre, no podemos comprometernos con un plazo de lanzamiento, pero esto ha afectado a muchos desarrolladores y realmente queremos resolverlo.

Anteriormente, sugerí agregar un pequeño retraso en la aplicación: didFinishLaunchingWithOptions y applicationDidBecomeActive: antes de acceder al llavero como solución alternativa. Sin embargo, eso en realidad no parece ayudar. Eso significa que no hay solución conocida en este momento aparte de relanzar la aplicación.

El problema parece estar relacionado con la presión de la memoria, por lo que quizás ser más agresivo al manejar las advertencias de memoria puede aliviar el problema.

De otro miembro del personal de Apple:

  • La ingeniería de llavero es muy consciente de la importancia de este problema.
  • El principal problema ha sido reproducir la falla aquí en Apple.
  • Ahora podemos hacerlo (en gran parte gracias al trabajo que ustedes han realizado en la presentación y el seguimiento de los informes de errores).

De otro miembro del personal de Apple el 22 de marzo de 2016 :

OK, aquí está lo último. 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 son 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 se resolvieron en iOS 9.3. Sospechamos que aún puede haber más causas de este problema. Entonces, 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 errores (me doy cuenta de que puede ser complicado cuando se trata de dispositivos del cliente, una opción es pedirle al cliente que instale Apple Configurator, que les permite ver el registro del sistema). Y si archivas un error, publica tu número de error, solo para el registro. En nombre de Apple, me gustaría agradecer a todos por sus esfuerzos para ayudar a rastrear este problema bastante horrible. Comparte y Disfruta

Lamentablemente, no se conocen soluciones provisionales y el problema aún no se soluciona en 9.3.2 Beta 1 (13F51a)