for - SecItemAdd siempre devuelve el error-34018 en Xcode 8 en el simulador de iOS 10
xcode 9.0 download (7)
En Xcode 8.1 GM Release Notes Apple reconoció el problema y sugirió una solución más limpia:
Las API de llavero pueden no funcionar en el simulador si su archivo de derechos no contiene un valor para el derecho de identificador de la aplicación. (28338972) Solución alternativa: agregue una configuración de compilación definida por el usuario a su objetivo llamado ENTITLEMENTS_REQUIRED y establezca el valor en YES. Esto hará que Xcode inserte automáticamente un derecho de identificador de aplicación al compilar.
Tenga en cuenta que, por lo que he intentado, solo funciona en Xcode 8.1. Aunque el texto puede confundirlo con una configuración de compilación, lo que debe hacer es agregar esto a sus Variables de entorno, en su esquema.
Xcode 8.2 resolverá esto:
Resuelto en Xcode 8.2 beta: las API IDE Keychain funcionan correctamente en Simulator. (28338972)
Actualización : este problema se ha solucionado en Xcode 8.2. Keychain funciona en el simulador sin habilitar el uso compartido de keychain.
¿Por qué
siempre
recibo el error -34018 cuando llamo a la función
SecItemAdd
en el simulador Xcode 8 / iOS 10
?
Pasos para reproducir
Cree un nuevo proyecto de aplicación iOS de página única en Xcode 8. Ejecute el siguiente código en
viewDidLoad
(o abra
this
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 al llavero.
Resultados actuales
La función 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 prueba en un simulador de iOS 10.
NO ocurre en Xcode 8 cuando se prueba en un simulador iOS 9.3.
Manifestación
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 siguiente publicación porque se produce de forma coherente en Xcode 8. SecItemAdd y SecItemCopyMatching devuelve el código de error -34018 (errSecMissingEntitlement)
Estaba buscando una solución que no utilizara el uso compartido de Keychain, ya que esa no era la característica que estaba buscando. https://forums.developer.apple.com/message/179846 parece tener un buen trabajo de EvergreenCoder que puede limitar en alcance solo al simulador de iOS 10 (ya que este parece ser el único simulador afectado). De la publicación:
El problema parece ser que debe haber al menos un derecho para que Xcode agregue correctamente el enttilement "identificador de aplicación" a la aplicación compilada. Esta es la razón por la cual el intercambio de llaveros parece ser una solución, pero solo lo es indirectamente: cualquier otro derecho parece funcionar bien.
Puede 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 proporcionar una ruta a ese archivo en Configuración de compilación 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.
Funciona después de habilitar el intercambio de llavero en capacidades.
Pude solucionar este problema en mi aplicación agregando Grupos de acceso de llavero al archivo de Derechos. Encendí el interruptor Compartir llavero en la sección Capacidades de su aplicación de prueba, y también funciona para mí.
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 de si funcionará para usted en 10.11.5.
Recibí un error al firmar con el correo electrónico, al crear un nuevo usuario o al cerrar sesión con firebase.
El error fue:
código de dominio de error firauth 17995
Encendí el interruptor Compartir llavero en la sección Capacidades de su aplicación de prueba, y también funciona para mí.
Tuve un problema similar, aunque recibí el error -34018 al intentar ejecutar en el dispositivo. Estoy usando XCode 8.1 en Sierra con iOS 10.1. Trabajo en un equipo y de repente tuve este problema cuando cambiamos a "Administrar automáticamente la firma" en la configuración del proyecto. Cuando apago esto y selecciono manualmente mi perfil, todo funciona bien. Terminé teniendo que eliminar mi certificado de desarrollador de mi llavero y luego volver a seleccionar "Gestionar automáticamente la firma". En la próxima compilación, generó un nuevo certificado de firma para mí y todo funciona bien ahora. Todavía no estoy seguro de qué causó el problema, ya que el otro certificado funcionó bien cuando se seleccionó manualmente, pero no cuando XCode lo administra. Espero que esto ayude a detener el dolor de cabeza de una hora para otra persona.