Atualização : esse problema foi corrigido no Xcode 8.2. As chaves funcionam no simulador sem permitir o compartilhamento das chaves.
Por que sempre recebo o erro -34018 ao chamar a SecItemAdd
função no simulador Xcode 8 / iOS 10 ?
Passos para reproduzir
Crie um novo projeto de aplicativo iOS de página única no Xcode 8. Execute o código a seguir viewDidLoad
(ou abra este projeto 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 esperados
O item é adicionado ao Keychain.
Resultados reais
Função SecItemAdd retorna o seguinte código de erro: -34018
.
Versão
Xcode versão 8.1 (8B62), macOS Sierra 10.12.1.
Configuração
Sempre ocorre no Xcode 8 desde o Beta 2 ao testar em um simulador iOS 10.
NÃO ocorre no Xcode 8 ao testar em um simulador iOS 9.3.
Demo
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Referências
Radar: https://openradar.appspot.com/27422249
Fóruns de desenvolvedores da Apple: https://forums.developer.apple.com/message/179846
Esse problema é diferente da postagem a seguir porque ocorre de forma consistente no Xcode 8. SecItemAdd e SecItemCopyMatching retorna o código de erro -34018 (errSecMissingEntitlement)
Respostas:
Consegui contornar isso em meu aplicativo adicionando grupos de acesso às chaves ao arquivo Direitos. Eu ativei o switch Keychain Sharing na seção Capacidades em seu aplicativo de teste, e ele está funcionando para mim também.
Item a ser adicionado aos direitos:
Eu tentei isso apenas no macOS Sierra (10.12), então não tenho certeza se funcionará para você no 10.11.5.
fonte
No Xcode 8.1 GM Release Notes, a Apple reconheceu o problema e sugeriu uma solução mais limpa:
Observe que, pelo que tentei, ele só funciona no Xcode 8.1. Embora o texto possa induzir você a uma configuração de construção, o que você precisa fazer é adicionar isso às suas Variáveis de Ambiente, em seu esquema.
O Xcode 8.2 resolverá isso:
fonte
Isso pode acontecer se você tiver um destino de teste que não tenha um aplicativo host. Consertar
adicionar um aplicativo host fictício:
Ative a assinatura automática de código e adicione uma equipe:
fonte
Recebi um erro ao assinar com o e-mail, criar um novo usuário ou ao sair usando o firebase.
O erro foi:
Eu ativei o switch Keychain Sharing na seção Capacidades em seu aplicativo de teste, e ele está funcionando para mim também.
fonte
Eu estava procurando por uma solução que não usasse o compartilhamento de chaves, já que esse não era o recurso que eu estava procurando. O fórum de desenvolvedores parece ter uma boa solução para o EvergreenCoder, que você pode limitar em escopo apenas ao simulador iOS 10 (já que este parece ser o único simulador afetado). Da postagem:
Você pode criar um
.plist
assim:e forneça um caminho para esse arquivo em Build Settings em
Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file
Conforme declarado na postagem, este direito apenas permite que o depurador seja anexado.
fonte
Tive um problema semelhante, embora recebesse o erro -34018 ao tentar executar no dispositivo. Estou usando o XCode 8.1 no Sierra com iOS 10.1. Trabalho em equipe e de repente tive esse problema quando mudamos para "Gerenciar automaticamente a assinatura" nas configurações do projeto. Quando eu desligo isso e seleciono manualmente meu perfil, tudo funciona bem. Acabei tendo que excluir meu certificado de desenvolvedor do meu chaveiro e selecionar novamente "Gerenciar assinatura automaticamente". Na próxima compilação, ele gerou um novo certificado de assinatura para mim e tudo funciona bem agora. Ainda não tenho certeza do que causou o problema, pois o outro certificado funcionou bem quando selecionado manualmente, mas não quando gerenciado pelo XCode. Espero que isso ajude a parar uma dor de cabeça de horas para outra pessoa.
fonte
Consegui resolver esse problema no Xcode 11 sem nenhum ajuste de autorização.
Simplesmente adicionei um novo destino de aplicativo ao projeto do meu framework chamado MyFrameworkTestsHostApp.
Em seguida, selecionei o destino MyFrameworkTests e escolhi seu aplicativo host como MyFrameworkTestsHostApp.
fonte
Funciona depois de habilitar o compartilhamento de chaves nos recursos.
fonte
Há três etapas a serem seguidas para resolver esse problema rapidamente.
Isso vai fazer a mágica
fonte