2016-07-07 122 views
0

我在IOS(xcode 6.4)中構建了一個簡單的登錄和註冊。要保存用戶名和密碼,我正在使用NSUserDefaults。但問題是我不能存儲多個用戶名和密碼,因爲我將數據保存到同一個鍵。什麼是實現它的替代方法。我在stackoverflow上看到了一些類似的問題,但無法理解解決方案。所以任何人都可以用簡單的方式解釋這裏是我的代碼:在NSUserDefaults中存儲多個鍵值對

//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"]; 
    } 
} 
+2

不要使用NSUserDefaults的存儲密碼,它是不安全的。使用鑰匙串來存儲這些數據。 –

+0

@SimonMcLoughlin我知道。但我試圖學習使用NSUserDefaults –

+0

對於那些擔心密碼,只是將其視爲一個關於以用戶默認值存儲多對數據的一般問題。 – Avi

回答

1

正如西蒙指出,有存儲用戶名和密碼在NSUserDefaults安全問題。如果你仍然想要這樣做,那很簡單。

NSUserDefaults真的不是更那麼plist這樣你就可以存儲從NSArrayNSDictionaryNSUserDefaults創建任意複雜結構。所以你可以這樣做:

NSArray<NSDictionary*>* accounts = @[@{ 
    @"username" : @"firstUsername", 
    @"password" : @"firstPassword" 
}, @{ 
    @"username" : @"secondUsername", 
    "password" : @"secondPassword" 
}]; 
[[NSUserDefaults standardUserDefaults] setObject: accounts forKey:@"accounts"]; 

請注意,您不能只更改一個帳戶;如果您需要更改或添加新帳戶,則應該閱讀整個結構,將數組和字典轉換爲可變的變體,然後將它們重新編寫爲默認值。

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"]; 
+0

如何做到這一點。我是新手到iOS,所以可以解釋更多 –

+0

我用一個例子更新了答案。有關更多信息,請檢查NSMutableArray和NSMutableDictionary的類引用。 – MrTJ

0

你可以簡單的保存您的密碼鍵的用戶名的對象,有人認爲這樣的:

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