Armazenar a senha no chaveiro de maneira inteligente

NSURLCredential é a classe perfeita para armazenar nome de usuário e senha nas chaves . Não há necessidade de se preocupar com NSUserDefaults nem com qualquer wrapper de chaveiro.

Depois que o usuário estiver conectado, você pode armazenar seu nome de usuário e senha nas chaves:

NSURLCredential *credential;

credential
= [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];

Conforme declarado no Apple Doc , NSURLCredentialPersistencePermanentdeve ser usado para armazenar no chaveiro.

Então, cada vez que o aplicativo for iniciado, você pode verificar se o seu usuário já estava logado, procurando por qualquer credencial, a fim de fazer o login automaticamente de volta (se necessário):

NSURLCredential *credential;
NSDictionary *credentials;

credentials
= [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential
= [credentials.objectEnumerator nextObject];
NSLog(@"User %@ already connected with password %@", credential.user, credential.password);

Você também precisa limpar a credencial quando o usuário deseja fazer logout:

NSURLCredential *credential;
NSDictionary *credentials;

credentials
= [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential
= [credentials.objectEnumerator nextObject];
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:obj forProtectionSpace:self.loginProtectionSpace];

loginProtectionSpace é criado de uma vez por todas.

Observe que este código de amostra assume que há apenas uma credencial neste espaço, o que geralmente é o caso, a menos que você gerencie várias contas.