Reputation: 19
I am building a simple login and registration in IOS (xcode 6.4). To save username and password i am using NSUserDefaults
. But the problem is I Can't store multiple username and passwords since I am saving data to same key.What's the alternate method to implement it.I saw some similar questions on stackoverflow but couldn't understand the solution. So can anyone explain in easy way. HEre is my code:
//function for login pressed
- (IBAction)login:(UIButton *)sender
{
NSLog(@"%@,%@",userNameField.text,passwordField.text);
username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];
NSLog(@"%@,%@",username,password);
bool validUser = [username isEqualToString:userNameField.text];
bool validPassword = [password isEqualToString:passwordField.text];
if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text])
{
[self displayAlert:@"All Fileds are mandatory"];
}
else if(validUser && validPassword)
{
[self displayAlert:@"Successfull Login"] ;
}
else{
// NSLog(@"Invalid username or password");
[self displayAlert:@"Invalid login or password"];
}
}
//function when register button is pressed
- (IBAction)register:(UIButton *)sender
{
if([[[NSUserDefaults standardUserDefaults] objectForKey:@"username"] isEqualToString:userNameField.text])
{
[self displayAlert:@"User already exist"];
userNameField.text = @"";
passwordField.text = @"";
}
else
{
[[NSUserDefaults standardUserDefaults] setObject:userNameField.text forKey:@"username"];
[[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:@"password"];
[[NSUserDefaults standardUserDefaults]synchronize];
NSLog(@"user Created successfully");
[self displayAlert:@"Registration Successfull"];
}
}
Upvotes: 0
Views: 731
Reputation: 5148
You can simple save your password as object of key username, some think like:
- (IBAction)login:(UIButton *)sender {
NSLog(@"%@,%@",userNameField.text,passwordField.text);
NSString *password = userNameField.text.length > 0? [[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] : nil;
bool validUser = passwordField.text.length > 0 ? [passwordField.text isEqualToString:password] : NO;
if ([self checkWhetherFieldIsEmpty:userNameField.text :passwordField.text]) {
[self displayAlert:@"All Fileds are mandatory"];
}
else if(validUser){
[self displayAlert:@"Successfull Login"] ;
}
else{
// NSLog(@"Invalid username or password");
[self displayAlert:@"Invalid login or password"];
}
}
//function when register button is pressed
- (IBAction)register:(UIButton *)sender {
//TODO: need check userNameField passwordField is not nil here
if([[[NSUserDefaults standardUserDefaults] objectForKey:userNameField.text] length] > 0){
[self displayAlert:@"User already exist"];
userNameField.text = @"";
passwordField.text = @"";
}
else {
[[NSUserDefaults standardUserDefaults] setObject:passwordField.text forKey:userNameField.text];
[[NSUserDefaults standardUserDefaults]synchronize];
NSLog(@"user Created successfully");
[self displayAlert:@"Registration Successfull"];
}
}
Upvotes: 0
Reputation: 13202
As pointed out by Simon, there are security issues storing usernames and passwords in NSUserDefaults
. If you still want to do it however, it is quite simple.
NSUserDefaults
is really not much more then a plist
so you can store arbitrary complex structures created from NSArray
and NSDictionary
in NSUserDefaults
. So you can do something like:
NSArray<NSDictionary*>* accounts = @[@{
@"username" : @"firstUsername",
@"password" : @"firstPassword"
}, @{
@"username" : @"secondUsername",
"password" : @"secondPassword"
}];
[[NSUserDefaults standardUserDefaults] setObject: accounts forKey:@"accounts"];
Note that you can't change one account only; if you need to change or add a new account, you should read the whole structure, convert the array and the dictionaries to mutable variants, and re-write it to the defaults all together.
UPDATE
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* mutableAccounts = [[defaults objectForKey:@"accounts"] mutableCopy];
// Add or remove accounts:
[mutableAccounts addObject:@{ @"username" : @"newAccount", @"password" : @"newPassword" }];
[mutableAccounts removeObjectAtIndex:0];
[defaults setObject:mutableAccounts forKey:@"accounts"];
Upvotes: 1