Eu tenho uma tela de login no meu aplicativo iOS. O nome de usuário e a senha serão salvos NSUserDefaults
e carregados na tela de login novamente quando você entrar no aplicativo novamente (é claro, NSUserDefaults
é permanente).
Agora, o usuário tem a possibilidade de desativar o recurso de economia de nome de usuário / senha.
Então o NSUserDefaults
será limpo então.
Mas, no meu aplicativo, preciso desse nome de usuário / senha para consultas ao banco de dados do usuário. Então: onde armazenar os dados, exceto NSUserDefaults
? (Este local pode / deve ser excluído quando o usuário sair do aplicativo ou sair).
ios
nsuserdefaults
keychain
Kovu
fonte
fonte
Respostas:
Você deve sempre usar o Keychain para armazenar nomes de usuário e senhas e, como ele é armazenado de forma segura e acessível apenas ao seu aplicativo, não há necessidade de excluí-lo quando o aplicativo é encerrado (se essa era sua preocupação).
A Apple fornece um código de amostra que armazena, lê e exclui itens de chaveiro e eis como usar a classe de wrapper de chaveiro dessa amostra, o que simplifica bastante o uso de chaveiro.
Inclua Security.framework (no Xcode 3, clique com o botão direito do mouse na pasta frameworks e adicione a estrutura existente. No Xcode 4, selecione seu projeto, selecione o destino, vá para a guia Build Phases e clique em + em Link Binary With Files) e KeychainItemWrapper .h &. m no seu projeto, # importe o arquivo .h onde quer que você precise usar as chaves e, em seguida, crie uma instância desta classe:
( YourAppLogin pode ser qualquer coisa que você escolher para chamar seu item Keychain e você pode ter vários itens, se necessário)
Em seguida, você pode definir o nome de usuário e a senha usando:
Obtenha-os usando:
Ou exclua-os usando:
fonte
kSecValueData
ekSecAttrAccount
no código Objective-C, portanto, lance-as usando(__bridge id)
, por exemplo,[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Se você precisar de uma versão ARC da embalagem aqui está o link https://gist.github.com/1170641 Graças à
fonte
Uma solução muito fácil via Keychains .
É um invólucro simples para o sistema Keychain. Basta adicionar o
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
eSSKeychainQuery.m
arquivos ao seu projeto e adicionar o Security.framework para o seu alvo.Para salvar uma senha:
Para recuperar uma senha:
Onde
setPassword
está o valor que você deseja salvar eforService
qual a variável em que você deseja que ele seja salvo e a conta é para qual usuário / objeto a senha e qualquer outra informação serve.fonte
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Isso deve funcionar bem se você usar apenas uma conta. Como sempre, certifique-se de verificar o comprimento da matriz antes de tentar índice de acesso 0.Você pode simplesmente usar
NSURLCredential
, ele salvará nome de usuário e senha no chaveiro em apenas duas linhas de código .Veja minha resposta detalhada .
fonte
Decidi responder como usar chaveiro no iOS 8 usando Obj-C e ARC.
1) Usei o keychainItemWrapper (versão ARCifief) do GIST: https://gist.github.com/dhoerl/1170641/download - Adicione (+ copie) o KeychainItemWrapper.he .m ao seu projeto
2) Adicione a estrutura de segurança ao seu projeto (verifique o projeto> Fases de construção> Vincular binário às bibliotecas)
3) Adicione a biblioteca de segurança (#import) e KeychainItemWrapper (#import "KeychainItemWrapper.h") ao arquivo .he .m onde deseja usar as chaves.
4) Para salvar dados no chaveiro:
5) Leia os dados (provavelmente a tela de login ao carregar> viewDidLoad):
Aproveitar!
fonte
Se você estiver com problemas para recuperar a senha usando o wrapper de chaveiro, use este código:
fonte
checkout este código de exemplo, tentei primeiro o invólucro da maçã a partir do código de exemplo, mas isso é muito mais simples para mim
fonte
tente este:
pode ajudar.
fonte
Eu olhei para usar o KeychainItemWrapper (a versão do ARC), mas não achei o invólucro do Objective C tão íntegro quanto desejado.
Eu usei esta solução por Kishikawa Katsumi , o que significa que escrevi menos código e não precisei usar moldes para armazenar valores de NSString.
Dois exemplos de armazenamento:
Dois exemplos de recuperação
fonte
Existe um pequeno bug no código acima (a propósito, Dave, foi muito útil seu post, obrigado)
Na parte em que salvamos as credenciais, ele também precisa do código a seguir para funcionar corretamente.
o mais provável é que, na segunda vez em que tentamos (re) entrar com as mesmas credenciais, eles já estão atribuídos nos itens de chaveiro e o aplicativo trava. com o código acima, funciona como um encanto.
fonte
Para atualizar esta pergunta:
Para aqueles que usam o Swift checkout, essa implementação rápida de arrastar e soltar do Mihai Costea que suporta grupos de acesso:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Antes de usar o chaveiro: considere duas vezes antes de armazenar senhas. Em muitos casos, o armazenamento de um token de autenticação (como um ID de sessão de persistência) e o nome do email ou da conta podem ser suficientes. Você pode invalidar facilmente os tokens de autenticação para bloquear o acesso não autorizado, exigindo que o usuário efetue login novamente no dispositivo comprometido, mas não exigindo redefinição de senha e tendo que efetuar login novamente em todos os dispositivos (não estamos apenas usando a Apple, não é?).
fonte
Mas agora você pode optar por NURLCredential em vez de wrapper de chaveiro. Faz o que precisamos fazer.
fonte
Para o swift, você pode usar esta biblioteca:
https://github.com/jrendel/SwiftKeychainWrapper
Ele suporta todas as versões do swift.
fonte
O seguinte deve funcionar bem:
fonte