A veces, cuando ejecuto una aplicación en el dispositivo desde Xcode, intento acceder al llavero pero falla debido al error -34018. Esto no coincide con ninguno de los códigos de error del llavero documentados y no se puede reproducir de forma coherente. (sucede tal vez el 30% de las veces, y no tengo claro por qué sucede). Lo que dificulta la depuración de este problema es la falta total de documentación. ¿Alguna idea de qué causa esto y cómo solucionarlo? Estoy usando Xcode 5 y ejecuto iOS 7.0.4 en el dispositivo.
Hay un problema abierto sobre esto aquí: https://github.com/soffes/sskeychain/issues/52
EDITAR: Agregar código de acceso al llavero por solicitud
Estoy usando la SSKeychain
biblioteca para interactuar con el llavero. Aquí está el fragmento.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
La gran mayoría de las veces está bien. A veces encuentro fallas de afirmación en las que no puedo escribir o leer desde el llavero, lo que provoca una falla crítica de afirmación.
fuente
Respuestas:
Una respuesta aquí, de Apple:
https://forums.developer.apple.com/thread/4743#14441
ACTUALIZAR
https://forums.developer.apple.com/thread/4743#126088
fuente
Básicamente, debe codificar su carpeta .xcttest agregando lo siguiente como un script de ejecución en su objetivo de prueba.
Obtuve muchos errores -34018 al probar mi llavero en el dispositivo y esto logró solucionarlo.
Si el problema no existe en su objetivo de prueba, probablemente esta no sea la solución.
fuente
Después de inspeccionar el código fuente . He notado que se accede a las funciones del llavero a través de un demonio de seguridad que se ejecuta en su propio proceso (separado del proceso de la aplicación).
Su aplicación y el proceso de seguridad 'dialogan' juntos a través de una tecnología llamada XPC .
Si es necesario, el securityd se inicia mediante el conocido comando launchd de XPC. Probablemente pueda verificar que el demonio se esté ejecutando en la aplicación Activity Monitor (si se ejecuta en Simulator, por supuesto) y que su proceso principal se haya iniciado.
Supongo que es posible que, por alguna razón desconocida, el demonio de seguridad no se inicie o lo haga demasiado lento y no esté listo cuando intente utilizarlo.
Quizás podría pensar en cómo prelanzar el demonio.
Pido disculpas por no ser más preciso. Espero que pueda ayudarlo a avanzar un poco más en sus investigaciones.
fuente
Observo un comportamiento similar después de compilar y ejecutar mi código en Xcode 6 beta con iOS 8 SDK (funciona correctamente con Xcode 5 / iOS 7). En Xcode 6, en iOS Simulator SecItemCopyMatching siempre devuelve -34018. Comenzó a funcionar después de activar "Compartir llaveros" en la pestaña Capacidades.
Sin embargo, tengo otro problema. Estoy desarrollando una biblioteca estática, que es utilizada por (entre otros) la aplicación de demostración. La solución anterior funciona para el proyecto de la aplicación de demostración, pero cuando trato de realizar una prueba unitaria en mi proyecto de biblioteca estática, tengo exactamente el mismo error. Y el problema es que mi proyecto de biblioteca estática no tiene la pestaña Capacidades (ya que no es la aplicación independiente).
Probé la solución publicada aquí por JorgeDeCorte, con firma de código en el objetivo de prueba, pero no me funciona.
fuente
Intente deshabilitar todos los puntos de interrupción al iniciar la aplicación desde Xcode. Puede habilitarlos después.
(Ninguna de las soluciones anteriores funcionó para mí)
fuente
Acabo de tener el mismo problema en el simulador que ejecuta 7.1 y 8.0. Mientras investigaba un poco, noté que la aplicación de muestra de Apple tenía KeyChain Sharing activado para sus capacidades de destino. Lo encendí para mi aplicación, lo que resultó en la creación de un archivo de derechos que dejé con los valores predeterminados y ahora ya no recibo más errores -34018. Esto no es ideal, pero viviré la opción de compartir KeyChain por ahora.
fuente
Diseñar con código un paquete .xctest no es tan fácil como parece en algunos casos. Principalmente, JorgeDeCorte tiene razón con su respuesta de que la línea corta dada como a
Run Script
es suficiente para la mayoría de los desarrolladores.Pero cuando tenga varios certificados en su llavero, esto fallará con la siguiente línea
Una solución para obtener el certificado correcto incluso con varios es este breve script. Seguro que esto no es ideal, pero que yo sepa, no tiene la oportunidad de obtener el certificado que Xcode encontró y usa para firmar su .app.
fuente
Esto también me mordió y no tuve éxito con ninguna de las otras soluciones. Luego limpié mis perfiles de aprovisionamiento en los dispositivos eliminando todos ellos relacionados con mi aplicación, así como todos los perfiles comodín (este parece ser el punto). Para hacer esto, vaya a la ventana "Dispositivos" en Xcode y haga clic derecho en su teléfono (conectado):
Haga clic en "Mostrar perfiles de aprovisionamiento" y elimine los relacionados, y especialmente los perfiles del equipo:
incluidos los que tienen el asterisco. Después de reinstalar la aplicación, todo volvió a la normalidad.
fuente
He solucionado este problema (creo). Tenía un perfil de aprovisionamiento de comodines en mi dispositivo que mostraba que no tenía una identidad de firma válida. También tenía un perfil de aprovisionamiento para mi aplicación que era válido. Cuando eliminé el perfil comodín, dejé de recibir los errores -34018.
También me aseguré de que la identidad de firma de código y el perfil de aprovisionamiento enumerados en la sección de firma de código de la configuración de compilación del destino fueran idénticos a los de la aplicación (no al genérico de "desarrollador de iPhone")
fuente
Me estaba -34.018 error en mi aplicación (iOS 8.4) en muy raras ocasiones. Después de investigar un poco, descubrí que este problema ocurre cuando la aplicación solicita datos del llavero con demasiada frecuencia .
Por ejemplo, en mi situación, fueron dos solicitudes de lectura para una clave específica al mismo tiempo desde diferentes módulos de aplicación.
Para solucionarlo, acabo de agregar el almacenamiento en caché de este valor en la memoria
fuente
Estaba teniendo el mismo problema, de la nada, ejecutándome en un dispositivo de prueba con Xcode 6.2, iPhone 6, iOS 8.3. Para ser claros, esto no se experimentó al ejecutar las pruebas de Xcode, sino al ejecutar la aplicación real en mi dispositivo. En el simulador estaba bien, y ejecutándose en la propia aplicación, había estado perfectamente bien hasta hace poco.
Probé todas las sugerencias que pude encontrar aquí, como eliminar los perfiles de aprovisionamiento en mi dispositivo (eliminé TODOS), habilitar temporalmente la capacidad de compartir llaveros en mi proyecto (aunque realmente no lo necesitamos), haciendo Seguro que mi cuenta de desarrollo en Xcode se actualizó totalmente con todos los certificados y perfiles de aprovisionamiento, etc. Nada ayudó.
Luego cambié temporalmente el nivel de accesibilidad de
kSecAttrAccessibleAfterFirstUnlock
akSecAttrAccessibleAlwaysThisDeviceOnly
, ejecuté la aplicación, funcionó bien y pude escribir en el llavero. Luego lo cambié de nuevo akSecAttrAccessibleAfterFirstUnlock
, y el problema parece haber desaparecido "permanentemente".fuente
Acabo de ser picado por este error en Xcode 8 Beta 3. Activar Keychain Sharing parece ser la única solución.
fuente
Tuve el mismo problema. Se solucionó configurando Keychain Sharing.
fuente
(esta no es una respuesta directa a la pregunta del OP, pero podría ayudar a otros)
Comenzó a recibir el error de llavero -34018 de manera consistente en el simulador después de actualizar Xcode de la versión 7.3.1 a 8.0.
Siguiendo este consejo de la respuesta de daidai ,
se descubrió que el Perfil de aprovisionamiento se había establecido de alguna manera en Ninguno en las secciones Firma del destino.
Sin embargo, establecer los campos del perfil de aprovisionamiento en valores válidos no fue suficiente para resolver el problema en este caso.
Una investigación adicional mostró que el derecho a las notificaciones automáticas también mostraba un error. Decía "Agregar la función de notificaciones automáticas a su ID de aplicación". se completó el paso, pero el paso "Agregar el derecho de notificaciones automáticas a su archivo de derechos" no lo fue.
Después de presionar "Solucionar problema" para solucionar el problema de las notificaciones push, se resolvió el error del llavero.
Para este objetivo en particular, el derecho "Uso compartido de llaveros" ya se había activado en algún momento anterior. Apagarlo no ha provocado que el error del llavero vuelva a aparecer hasta ahora, por lo que no está claro si es necesario en este caso.
fuente
En iOS 9 apagué Address Sanitizer y comenzó a funcionar en el dispositivo.
fuente
La única solución que funcionó para mí fue almacenar primero nil para la clave especificada y luego almacenar mi nuevo valor con una operación separada. Fallaría debido al error -34018 si intentara sobrescribir el valor existente. Pero siempre que haya almacenado nil primero, el valor actualizado se almacenará correctamente inmediatamente después.
fuente
Encontré este problema -34018 hoy al ejecutar SecItemDelete API. Lo que hice para solucionar esto es: 1. Siguiendo la solución @ k1th https://stackoverflow.com/a/33085955/889892 2. Ejecute el SecItemDelete en el hilo principal (anteriormente se lee desde el hilo principal, así que simplemente alinee esto con la eliminación) .
Lo siento, vuelve de nuevo :(
fuente
Active el uso compartido de llaveros en las capacidades de su proyecto, debería resolver el problema.
fuente
Que funciono para mi
fuente
Para mí fue un problema de firma de aplicaciones. Simplemente cambié al equipo de firma correcto en Xcode y el error ya no se produjo
fuente