-2

I need to save User Name and Password in NSUserDefault. I am planning to place a round rect button in IB. On pressing of which the User name and Password would be saved in NSUserDefault, so that when user kills the application and tries to login again after some time, they do not need to enter their login details again. Any help would be highly appreciated.

Thanks and best regards,

PC

Prateek Chaubey
  • 653
  • 2
  • 10
  • 24
  • 9
    Have you considered putting them in the keychain instead? – Simon Sep 06 '12 at 10:52
  • 6
    Please don't store usernames and passwords into user defaults, take a look at [Keychain](http://stackoverflow.com/questions/6972092/ios-how-to-store-username-password-within-an-app/6972305#6972305). – Filip Radelic Sep 06 '12 at 10:52

7 Answers7

7

For Saving Username and Password I will personally suggest to use Keychain as they are more safer than NSUserDefault in terms of security since Keychain stores data in encrypted form while NSUserDefault stores as plain text. If you still want to use NSUserDefault Here's the way

FOR SAVING

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

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

 [prefs synchronize];

FOR RETRIEVING

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

// getting an NSString
NSString *savedUsername = [prefs stringForKey:@"userName"];
NSString *savedPassword = [prefs stringForKey:@"password"];
Suresh Varma
  • 9,750
  • 1
  • 60
  • 91
4

Do not store plaintext passwords in user defaults, even if they are unimportant.

Use Keychain Services. The Generic Keychain Sample provides sample KeychainWrapper class, that can be used for reading and writing data into keychain with exactly the same setObject:forKey: interface as NSUserDefaults uses.

hamstergene
  • 24,039
  • 5
  • 57
  • 72
3

To Save:

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

To Read:

NSString * _UserName = [[NSUserDefaults standardUserDefaults] stringForKey:@"Username"];
NSString * _password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"];
Vikas S Singh
  • 1,748
  • 1
  • 14
  • 29
2

First off, I would not store the password in NSUserDefaults. I would rather use the keychain.

This is how you can save the username in NSUserDefaults:

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

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

On the other hand, an easy way to use the keychain is by using the SSKeychain class by Sam Soffes; in this case you would just say:

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

[SSKeychain setPassword:password forService:@"YOUSERVICENAMEHERE" account:username];
sergio
  • 68,819
  • 11
  • 102
  • 123
1

You can store your credentials like this:

-(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];
    }
}

And you can retrive them like this:

-(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;
}
Kanan Vora
  • 2,124
  • 1
  • 16
  • 26
0

Cannot set NSUserDefaults field

Posted my code from link to stay assured that answer is still useful to community even if the above mentioned post is removed or deleted in future.

Code:

You can try this code. I am very sure that it will work for you.

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

For Retrieving Data You Should Use The Following Code :

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

OR

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

EDIT:

If still it gives nil, then you can use the following code:

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

OR

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

In the above link, you will find my answer and replace "init_val" in my code there with your "username" and "password" as keys

Hope this helps you.

Community
  • 1
  • 1
Parth Bhatt
  • 19,381
  • 28
  • 133
  • 216
0

Good Answers are already given But here is a clean way of Saving/Loading/Deleting User Credentials in the keychain. Consider this, you can create a separate class and include the following code:

.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
Anurag Sharma
  • 4,276
  • 2
  • 28
  • 44