SecItemAdd siempre devuelve el error -34018 en Xcode 8 en el simulador de iOS 10

Actualización : este problema se ha solucionado en Xcode 8.2. Keychain funciona en el simulador sin habilitar el intercambio de llaveros.

¿Por qué siempre recibo el error -34018 al llamar a la function SecItemAdd en el simulador Xcode 8 / iOS 10 ?

Pasos para reproducir

Cree un nuevo proyecto de aplicación para una sola página iOS en Xcode 8. Ejecute el siguiente código en viewDidLoad (o abra este proyecto Xcode).

 let itemKey = "My key" let itemValue = "My secretive bee 🐝" // Remove from Keychain // ---------------- let queryDelete: [String: AnyObject] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: itemKey as AnyObject ] let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary) if resultCodeDelete != noErr { print("Error deleting from Keychain: \(resultCodeDelete)") } // Add to keychain // ---------------- guard let valueData = itemValue.data(using: String.Encoding.utf8) else { print("🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣 Error saving text to Keychain") return } let queryAdd: [String: AnyObject] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: itemKey as AnyObject, kSecValueData as String: valueData as AnyObject, kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked ] let resultCode = SecItemAdd(queryAdd as CFDictionary, nil) if resultCode != noErr { print("🐝🐝🐝🐝🐝🐝🐝🐝🐝 Error saving to Keychain: \(resultCode).") } else { print("🍀🍀🍀🍀🍀🍀🍀🍀🍀 Saved to keychain successfully.") } 

Resultados previstos

El artículo se agrega a Keychain.

Resultados actuales

La function SecItemAdd devuelve el siguiente código de error: -34018 .

Versión

Xcode versión 8.1 (8B62), macOS Sierra 10.12.1.

Configuración

Siempre ocurre en Xcode 8 desde Beta 2 cuando se testing en un simulador de iOS 10.

NO ocurre en Xcode 8 cuando se testing en un simulador iOS 9.3.

Manifestación

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

Referencias

Radar: https://openradar.appspot.com/27422249

Foros de desarrolladores de Apple: https://forums.developer.apple.com/message/179846

Este problema es diferente de la publicación siguiente porque aparece constantemente en Xcode 8. SecItemAdd y SecItemCopyMatching devuelve el código de error -34018 (errSecMissingEntitlement)

Pude evitar esto en mi aplicación agregando los grupos de acceso de llavero al file de derechos. Encendí el interruptor Compartir llavero en la sección Capacidades en su aplicación de testing, y también funciona para mí.

Captura de pantalla de encender el interruptor

Artículo para agregar a los derechos:

 <key>keychain-access-groups</key> <array> <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string> </array> 

Solo he intentado esto en macOS Sierra (10.12), así que no estoy seguro si funcionará para usted el 10.11.5.

En Xcode 8.1 Notas de la versión de GM, Apple reconoció el problema y sugirió una solución más limpia:

Las API de llavero pueden no funcionar en el Simulador si su file de derechos no contiene un valor para el derecho de identificación de la aplicación. (28338972) Solución: agregue una configuration de compilation definida por el usuario a su destino denominada ENTITLEMENTS_REQUIRED y establezca el valor en SÍ. Esto hará que Xcode inserte automáticamente un derecho identificador de la aplicación al crear.

Tenga en count que, de lo que he intentado, solo funciona en Xcode 8.1. Aunque el text puede inducirle a una configuration de compilation, lo que debe hacer es agregar esto a sus Variables de entorno, en su esquema.

introduzca la descripción de la imagen aquí

Xcode 8.2 resolverá esto:

Resuelto en Xcode 8.2 beta: las API IDE Keychain funcionan correctamente en Simulator. (28338972)

Esto puede suceder si tiene un objective de testing que no tiene una aplicación host. Arreglar

  1. agregar una aplicación de host ficticia: introduzca la descripción de la imagen aquí

  2. Habilite la firma automática de códigos y agregue un equipo:

introduzca la descripción de la imagen aquí

  1. Habilitar el intercambio de llaveros en capacidades

introduzca la descripción de la imagen aquí

Recibí un error al firmar con correo electrónico, crear un nuevo usuario o cerrar session con Firebase.

El error fue:

código de dominio de error firauth 17995

Encendí el interruptor Compartir llavero en la sección Capacidades en su aplicación de testing, y también funciona para mí.

Estaba buscando una solución que no utilizara el intercambio de llaveros, ya que esa no era la function que estaba buscando. El foro de desarrolladores parece tener un buen trabajo alnetworkingedor de EvergreenCoder que puede limitar en scope a solo el simulador de iOS 10 (ya que parece ser el único simulador afectado). Desde la publicación:

El problema parece ser que debe haber al less un derecho para que Xcode agregue correctamente el enttlement de "identificador de aplicación" a la aplicación incorporada. Esta es la razón por la que el intercambio de llaveros parece ser una solución, pero es solo indirectamente: cualquier otro derecho parece funcionar bien.

Puedes crear un .plist así:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-/ <plist version="1.0"> <dict> <key>get-task-allow</key> <true/> </dict> </plist> 

y proporcione una ruta a ese file en Configuración de compilation en

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

Como se indica en la publicación, este derecho solo permite adjuntar el depurador.

Tuve un problema similar, aunque obtuve el error -34018 cuando bash ejecutar en el dispositivo. Estoy usando XCode 8.1 en Sierra con iOS 10.1. Trabajo en equipo y de repente tuve este problema cuando cambiamos a "Administrar automáticamente la firma" en la configuration del proyecto. Cuando apago esto y selecciono manualmente mi perfil, todo funciona bien. Terminé teniendo que eliminar mi certificate de desarrollador de mi llavero, luego volví a seleccionar "Administrar automáticamente la firma". En la siguiente compilation, generó un nuevo certificate de firma para mí y todo funciona bien ahora. Todavía no estoy seguro de qué causó el problema, ya que el otro certificate funcionó bien cuando se seleccionó manualmente, pero no cuando lo administró XCode. Espero que esto ayude a detener el dolor de cabeza durante horas para alguien más.

Funciona después de habilitar el intercambio de llaveros en capacidades.