Às vezes, quando executo um aplicativo no dispositivo do Xcode, eu tentava acessar o keychain, mas falhava devido ao erro -34018. Isso não corresponde a nenhum dos códigos de erro de chaveiro documentados e não pode ser reproduzido de forma consistente. (acontece talvez 30% das vezes, e não está claro para mim por que acontece). O que torna a depuração desse problema muito difícil é a total falta de documentação. Alguma ideia do que causa isso e como consertar? Estou usando o Xcode 5 e executando o iOS 7.0.4 no dispositivo.
Há um problema em aberto sobre isso aqui: https://github.com/soffes/sskeychain/issues/52
EDIT: Adicionando código de acesso de chaveiro por solicitação
Estou usando a SSKeychain
biblioteca para fazer interface com as chaves. Aqui está o trecho.
#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
Na maioria das vezes, está tudo bem. Às vezes, encontro falhas de asserção em que não consigo escrever ou ler do keychain, causando uma falha crítica de asserção.
fonte
Respostas:
Uma resposta aqui, da Apple:
https://forums.developer.apple.com/thread/4743#14441
ATUALIZAR
https://forums.developer.apple.com/thread/4743#126088
fonte
Basicamente, você deve codificar sua pasta .xcttest adicionando o seguinte como um script de execução em seu destino de teste.
Eu recebi muitos erros -34018 ao testar meu chaveiro no dispositivo e isso conseguiu consertar.
Se o problema não existir no seu alvo de teste, provavelmente esta não é a solução.
fonte
Depois de inspecionar o código-fonte . Percebi que os recursos das chaves são acessados por meio de um daemon de segurança que é executado em seu próprio processo (separado do processo do aplicativo).
Seu aplicativo e o processo de segurança 'conversam' através de uma tecnologia chamada XPC .
Se necessário, o securityd é iniciado por meio do conhecido comando launchd do XPC. Provavelmente, você pode verificar se o daemon está em execução no aplicativo Activity Monitor (se estiver em execução no simulador, é claro) e se seu processo pai foi iniciado.
Meu palpite aqui é que é possível que, por algum motivo desconhecido, o daemon de segurança falhe ao iniciar ou faça isso muito lentamente e não esteja pronto quando você tentar usá-lo.
Talvez você possa pensar em como pré-lançar o daemon.
Peço desculpas por não ser mais preciso. Espero que possa ajudá-lo a ir mais longe em suas investigações.
fonte
Estou observando um comportamento semelhante depois de criar e executar meu código no Xcode 6 beta com iOS 8 SDK (está funcionando corretamente com o Xcode 5 / iOS 7). No Xcode 6, no iOS Simulator SecItemCopyMatching sempre retorna -34018. Ele começou a funcionar depois de ativar o “Compartilhamento de Chaves” na guia Capacidades.
No entanto, tenho outro problema. Estou desenvolvendo biblioteca estática, que é usada por (entre outros) aplicativo Demo. A solução acima funciona para o projeto de aplicativo Demo, mas quando tento fazer o teste de unidade do meu projeto de biblioteca estática, recebo exatamente o mesmo erro. E o problema é que meu projeto de biblioteca estática não tem a guia Capacidades (já que não é o aplicativo independente).
Já experimentei a solução postada aqui pelo JorgeDeCorte, com codesigning no alvo de teste, mas não funciona para mim.
fonte
Tente desativar todos os pontos de interrupção ao iniciar o aplicativo do Xcode. Você pode habilitá-los depois.
(Nenhuma das soluções alternativas acima funcionou para mim)
fonte
Acabei de ter o mesmo problema no simulador executando 7.1 e 8.0. Enquanto fazia algumas pesquisas, percebi que o aplicativo de amostra da Apple tinha o Compartilhamento de KeyChain ativado para seus recursos de destino. Eu o ativei para meu aplicativo, o que resultou na criação de um arquivo de direitos que deixei com os valores padrão e agora não estou recebendo mais erros -34018. Isso não é o ideal, mas vou usar a opção de compartilhamento KeyChain por enquanto.
fonte
Codificar um pacote .xctest não é tão fácil quanto parece em alguns casos. Principalmente JorgeDeCorte está certo em sua resposta de que a linha curta fornecida como um
Run Script
é suficiente para a maioria dos desenvolvedores.Mas quando você tem vários certificados em suas chaves, isso irá falhar com a seguinte linha
Uma solução para obter o certificado certo mesmo com vários é este pequeno script. Com certeza isso não é o ideal, mas pelo meu conhecimento você não tem chance de obter o certificado que o Xcode encontrou e usa para assinar seu .app.
fonte
Eu fui mordido por isso também e não tive sucesso com nenhuma das outras soluções alternativas. Em seguida, limpei meus perfis de provisionamento nos próprios dispositivos, excluindo todos eles relacionados ao meu aplicativo, bem como todos os perfis curinga (este parece ser o ponto). Para fazer isso, vá para a janela "Dispositivos" no Xcode e clique com o botão direito em seu telefone (conectado):
Clique em "Mostrar perfis de aprovisionamento" e exclua os relacionados, principalmente os perfis da equipe:
incluindo aqueles com o asterisco. Após a reinstalação do app, tudo voltou ao normal.
fonte
Eu resolvi esse problema (eu acho). Eu tinha um perfil de provisionamento curinga em meu dispositivo que mostrava que ele não tinha uma identidade de assinatura válida. Eu também tinha um perfil de provisionamento válido para meu aplicativo. Quando excluí o perfil curinga, parei de receber os erros -34018.
Também me certifiquei de que a identidade de assinatura de código e o perfil de provisionamento listado na seção de assinatura de código das Configurações de compilação do destino eram idênticos ao do aplicativo (não o genérico "desenvolvedor de iPhone")
fonte
Eu estava recebendo o erro -34018 em meu aplicativo (iOS 8.4) muito raramente. Após alguma investigação, descobri que esse problema ocorre quando o aplicativo solicita dados do keychain com muita frequência .
Por exemplo, na minha situação, foram duas solicitações de leitura para uma chave específica ao mesmo tempo de diferentes módulos de aplicativo.
Para corrigir isso, acabei de adicionar esse valor em cache na memória
fonte
Eu estava tendo o mesmo problema, do nada, rodando em um dispositivo de teste com Xcode 6.2, iPhone 6, iOS 8.3. Para ficar claro, isso não aconteceu durante a execução de testes do Xcode, mas sim durante a execução do aplicativo real no meu dispositivo. No simulador estava tudo bem, e rodando no próprio aplicativo estava perfeitamente bem até recentemente.
Tentei todas as sugestões que encontrei aqui, como remover os perfis de provisionamento do meu dispositivo (removi TODOS), ativar temporariamente o recurso de compartilhamento das chaves em meu projeto (embora não precisemos realmente disso), tornando Certifique-se de que minha conta de desenvolvimento no Xcode foi totalmente atualizada com todos os certificados e perfis de provisionamento, etc. Nada ajudou.
Em seguida, alterei temporariamente o nível de acessibilidade de
kSecAttrAccessibleAfterFirstUnlock
parakSecAttrAccessibleAlwaysThisDeviceOnly
, executei o aplicativo e ele funcionou bem e foi possível gravar no Keychain. Então mudei de volta parakSecAttrAccessibleAfterFirstUnlock
e o problema parece ter desaparecido "permanentemente".fonte
Acabei de ser mordido por esse bug no Xcode 8 Beta 3. Ativar o compartilhamento de chaves parece ser a única solução.
fonte
Eu tive o mesmo problema. Corrigido ao configurar o compartilhamento de chaveiro.
fonte
(esta não é uma resposta direta à pergunta do OP, mas pode ajudar outros)
Começou a obter o erro de keychain -34018 de forma consistente no simulador após atualizar o Xcode da versão 7.3.1 para 8.0.
Seguindo esta dica da resposta da daidai ,
foi descoberto que o Perfil de Provisionamento de alguma forma foi definido como Nenhum nas seções de Assinatura do destino.
No entanto, definir os campos do perfil de provisionamento com valores válidos não foi suficiente para resolver o problema neste caso.
Uma investigação mais aprofundada mostrou que o direito a notificações push também exibiu um erro. Ele dizia "Adicione o recurso de notificações push ao seu ID do aplicativo". etapa foi concluída, mas a etapa "Adicionar o direito de Notificações Push ao seu arquivo de direitos" não foi.
Depois de clicar em "Corrigir problema" para corrigir o problema de Notificação Push, o erro do keychain foi resolvido.
Para este destino específico, o direito de "Compartilhamento de Chaves" já havia sido ativado em algum momento anterior. Desligá-lo não fez com que o erro do keychain reaparecesse até agora, portanto, não está claro se ele é necessário neste caso.
fonte
No iOS 9, desliguei o Address Sanitizer e ele começou a funcionar no dispositivo.
fonte
A única solução que funcionou para mim foi primeiro armazenar nil para a chave especificada e, em seguida, armazenar meu novo valor com uma operação separada. Haveria falha devido ao erro -34018 se eu tentasse substituir o valor existente. Mas, desde que eu armazenasse nil primeiro, o valor atualizado seria armazenado com êxito imediatamente depois.
fonte
Eu encontrei este problema -34018 hoje ao executar a API SecItemDelete. O que fiz para consertar isso foi: 1. Seguindo @ k1th solução https://stackoverflow.com/a/33085955/889892 2. Execute o SecItemDelete no thread principal (anteriormente é lido do thread principal, então apenas alinhe isso com exclusão) .
Desculpe, ele volta novamente :(
fonte
Ative o compartilhamento de chaves nas capacidades do seu projeto, isso deve resolver o problema.
fonte
O que funcionou para mim
fonte
Para mim, era um problema de assinatura de aplicativo. Simplesmente mudei para a equipe de assinatura correta no Xcode e o erro não ocorreu mais
fonte