2012-09-06 4 views
-2

Мне нужно сохранить имя пользователя и пароль в NSUserDefault. Я планирую разместить круглую прямоугольную кнопку в IB. При нажатии на нее имя пользователя и Пароль будут сохранены в NSUserDefault, так что, когда пользователь убьет приложение и попытается снова войти в систему через некоторое время, им не нужно будет вводить свои данные для входа еще раз. Любая помощь будет высоко оценена.Как сохранить имя пользователя и пароль в NSUserDefault?

Спасибо и наилучшими пожеланиями,

PC

+9

Рассматривали ли вы положить их в связке ключей вместо этого? – Simon

+6

Пожалуйста, не храните имена пользователей и пароли в значениях по умолчанию пользователя, посмотрите на [Брелок для ключей] (http://stackoverflow.com/questions/6972092/ios-how-to-store-username-password-within-an-app/6972305 # 6972305). –

ответ

7

Для сохранения имени пользователя и пароля, я лично предлагаю использовать Keychain, поскольку они более безопасны, чем NSUserDefault с точки зрения безопасности, поскольку Keychain хранит данные в зашифрованном виде формы, а NSUserDefault хранится как обычный текст. Если вы все еще хотите использовать NSUserDefault Вот как

СПАСЕНИЯ

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

// saving an NSString 
[prefs setObject:txtUsername.text forKey:@"userName"]; 
[prefs setObject:txtPassword.text forKey:@"password"]; 

[prefs synchronize]; 

ДЛЯ ВОССТАНОВЛЕНИЕ

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

// getting an NSString 
NSString *savedUsername = [prefs stringForKey:@"userName"]; 
NSString *savedPassword = [prefs stringForKey:@"password"]; 
3

Спасти:

[[NSUserDefaults standardUserDefaults] setValue:_Username forKey:@"Username"]; 
[[NSUserDefaults standardUserDefaults] setValue:_password forKey:@"password"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

читать:

NSString * _UserName = [[NSUserDefaults standardUserDefaults] stringForKey:@"Username"]; 
NSString * _password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"]; 
1

Вы можете хранить свои учетные данные, как это:

-(void)saveToUserDefaults:(NSString*)stringUserName pswd:(NSString*)strPassword 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    if (standardUserDefaults) { 
     [standardUserDefaults setObject:stringUserName forKey:@"UserName"]; 
     [standardUserDefaults setObject:strPassword forKey:@"Password"]; 
     [standardUserDefaults synchronize]; 
    } 
} 

И вы можете retrive их так:

-(NSArray*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    if (standardUserDefaults) { 
     NSString *userName = (NSString*)[standardUserDefaults objectForKey:@"UserName"]; 
     NSString *password = (NSString*)[standardUserDefaults objectForKey:@"Password"]; 
    } 
    NSArray* credentials = [NSArray arrayWithObjects:userName, password, nil]; 
    return credentials; 
} 
4

Не храните незашифрованные пароли пользователей по умолчанию, даже если они не имеют значения ,

Keychain Services. В Generic Keychain Sample приведен пример класса KeychainWrapper, который может использоваться для чтения и записи данных в цепочку ключей с точно таким же интерфейсом setObject:forKey:, что и NSUserDefaults.

2

Во-первых, я бы не хранил пароль в NSUserDefaults. Я предпочел бы использовать брелок.

Это, как вы можете сохранить имя пользователя в NSUserDefaults:

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
[standardUserDefaults setObject:myString forKey:@"username"]; 

NSString* username = [standardUserDefaults objectForKey:@"username"]; 

С другой стороны, простой способ использовать брелок для ключей является использование SSKeychain class by Sam Soffes; в этом случае вы бы просто сказать:

NSString* password = [SSKeychain passwordForService:@"YOUSERVICENAMEHERE" account:username]; 

[SSKeychain setPassword:password forService:@"YOUSERVICENAMEHERE" account:username]; 
0

Cannot set NSUserDefaults field

Добавлено мой код из ссылки оставаться уверены, что ответ еще полезно сообщества, даже если указанное выше сообщение удаляется или удален в будущем.

Код:

Вы можете попробовать этот код. Я очень уверен, что это сработает для вас.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *[email protected]"1"; 
[defaults setObject:uid forKey:@"init_val"]; 
[defaults synchronize]; 

для извлечения данных вы должны использовать следующий код:

NSString *initVal=[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]; 

ИЛИ

NSString *initVal=[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]; 

EDIT:

Если еще дает nil, то вы можете использовать следующий код:

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]]; 

ИЛИ

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]]; 

В приведенной выше ссылке, вы найдете свой ответ и заменить «init_val» в моем коде там с «именем» и «пароль» как ключи

Надеюсь, это вам поможет.

0

Хорошие ответы уже даны Но вот чистый способ Сохранение/Загрузка/Удаление учетных данных пользователя в брелка. Рассмотрим это, вы можете создать отдельный класс и включает следующий код:

.h

#import <Foundation/Foundation.h> 

@interface KeychainUserPass : NSObject 

+ (void)save:(NSString *)service data:(id)data; 
+ (id)load:(NSString *)service; 
+ (void)delete:(NSString *)service; 

@end 

.m

#import "KeychainUserPass.h" 

@implementation KeychainUserPass 

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service { 

    return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, 
      service, (__bridge id)kSecAttrService, 
      service, (__bridge id)kSecAttrAccount, 
      (__bridge id)kSecAttrAccessibleAfterFirstUnlock, (__bridge id)kSecAttrAccessible, 
      nil]; 
} 

+ (void)save:(NSString *)service data:(id)data { 

    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
    SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL); 
} 

+ (id)load:(NSString *)service { 

    id ret = nil; 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
    CFDataRef keyData = NULL; 

    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
     @try { 
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
     } 
     @catch (NSException *e) { 
      NSLog(@"Unarchive of %@ failed: %@", service, e); 
     } 
     @finally {} 
    } 
    if (keyData) CFRelease(keyData); 
    return ret; 
} 

+ (void)delete:(NSString *)service { 

    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
} 


@end 
Смежные вопросы