Actualización : este problema se ha solucionado en Xcode 8.2. El llavero funciona en el simulador sin permitir el uso compartido del llavero.
¿Por qué siempre recibo el error -34018 al llamar a la SecItemAdd
función en el simulador de Xcode 8 / iOS 10 ?
Pasos para reproducir
Cree un nuevo proyecto de aplicación iOS de una sola página 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 al llavero.
Resultados actuales
Función SecItemAdd devuelve el código de error siguiente: -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 de 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 siguiente publicación porque ocurre consistentemente en Xcode 8. SecItemAdd y SecItemCopyMatching devuelven el código de error -34018 (errSecMissingEntitlement)
Respuestas:
Pude solucionar esto en mi aplicación agregando grupos de acceso a llaveros al archivo de derechos. Encendí el llavero Sharing interruptor en la Capacidad de la sección en la aplicación de prueba, y está trabajando para mí también.
Elemento para agregar a los derechos:
Solo probé esto en macOS Sierra (10.12), por lo que no estoy seguro de si funcionará para usted en 10.11.5.
fuente
En Xcode 8.1 GM Release Notes, Apple reconoció el problema y sugirió una solución más limpia:
Tenga en cuenta que, por lo que he probado, 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:
fuente
Esto puede suceder si tiene un objetivo de prueba que no tiene una aplicación de host. Arreglar
agregue una aplicación de host ficticia:
Habilite la firma automática de código y agregue un equipo:
fuente
Recibí un error al iniciar sesión con el correo electrónico, crear un nuevo usuario o cerrar sesión con firebase.
El error fue:
Encendí el interruptor de uso compartido de llaveros en la sección de Capacidades en su aplicación de prueba, y también me está funcionando.
fuente
Estaba buscando una solución que no usara el intercambio de llaveros, ya que esa no era la característica que estaba buscando. El foro de desarrolladores 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). Del post:
Puedes crear un me
.plist
gusta así:y proporcione 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.
fuente
Tuve un problema similar, aunque recibía el error -34018 al intentar ejecutar 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 "Gestionar 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 "Administrar la firma automáticamente". En la siguiente 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 lo administraba XCode. Espero que esto ayude a detener el dolor de cabeza de otra persona durante horas.
fuente
Pude resolver este problema en Xcode 11 sin ningún ajuste de derechos.
Simplemente agregué un nuevo destino de aplicación al proyecto de mi marco llamado MyFrameworkTestsHostApp.
Luego seleccioné el destino MyFrameworkTests y elegí su aplicación de host como MyFrameworkTestsHostApp.
fuente
Funciona después de habilitar el intercambio de llaveros en capacidades.
fuente
Hay tres pasos a seguir para resolver este problema rápidamente.
Esto hará la magia
fuente