Je suis très novice en matière de développement iOS, alors pardonnez-moi si c'est une question de débutant. J'ai un mécanisme d'authentification simple pour mon application qui prend l'adresse email et le mot de passe de l'utilisateur. J'ai aussi un interrupteur qui dit "Se souvenir de moi". Si l'utilisateur active cet interrupteur, j'aimerais conserver son adresse électronique et son mot de passe afin que ces champs puissent être remplis automatiquement à l'avenir.
J'ai réussi à le faire fonctionner en sauvegardant dans un fichier plist mais je sais que ce n'est pas la meilleure idée puisque le mot de passe n'est pas crypté. J'ai trouvé un exemple de code pour enregistrer dans le trousseau, mais pour être honnête, je suis un peu perdu. Pour la fonction ci-dessous, je ne suis pas sûr de savoir comment l'appeler et comment la modifier pour qu'elle enregistre également l'adresse email.
Je suppose qu'il faudrait l'appeler ainsi : saveString(@"passwordgoeshere");
Merci de votre aide !!!
+ (void)saveString:(NSString *)inputString forKey:(NSString *)account {
NSAssert(account != nil, @"Invalid account");
NSAssert(inputString != nil, @"Invalid string");
NSMutableDictionary *query = [NSMutableDictionary dictionary];
[query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[query setObject:account forKey:(id)kSecAttrAccount];
[query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible];
OSStatus error = SecItemCopyMatching((CFDictionaryRef)query, NULL);
if (error == errSecSuccess) {
// do update
NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObject:[inputString dataUsingEncoding:NSUTF8StringEncoding]
forKey:(id)kSecValueData];
error = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)attributesToUpdate);
NSAssert1(error == errSecSuccess, @"SecItemUpdate failed: %d", error);
} else if (error == errSecItemNotFound) {
// do add
[query setObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
error = SecItemAdd((CFDictionaryRef)query, NULL);
NSAssert1(error == errSecSuccess, @"SecItemAdd failed: %d", error);
} else {
NSAssert1(NO, @"SecItemCopyMatching failed: %d", error);
}
}
5 votes
J'ai corrigé le code de @Anomie pour qu'il fonctionne avec ARC et je l'ai mis sur Github (j'ai fait un lien vers cette réponse et mentionné votre utilisateur dans les deux fichiers, mais si vous voulez d'autres attributions, faites-le moi savoir). J'ai également modifié un peu le formatage et rendu les noms de méthodes un peu plus génériques. github.com/jeremangnr/JNKeychain