-2

我需要在 NSUserDefault 中保存用户名和密码。我打算在 IB 中放置一个圆形矩形按钮。按下后,用户名和密码将保存在 NSUserDefault 中,这样当用户杀死应用程序并在一段时间后再次尝试登录时,他们不需要再次输入登录详细信息。任何帮助将不胜感激。

谢谢和最好的问候,

个人电脑

4

7 回答 7

7

对于保存用户名和密码,我个人建议使用Keychain它们,因为它们比安全性更安全NSUserDefault,因为Keychain以加密形式存储数据而NSUserDefault以纯文本形式存储。如果您仍然想使用NSUserDefaultHere's the way

为了节省

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"];
于 2012-09-06T10:56:40.980 回答
4

不要将明文密码存储在用户默认值中,即使它们不重要。

使用钥匙串服务通用钥匙串示例提供了示例 KeychainWrapper 类,可用于将数据读取和写入钥匙串,其接口setObject:forKey:NSUserDefaults使用完全相同。

于 2012-09-06T10:57:09.177 回答
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"];
于 2012-09-06T10:50:48.630 回答
2

首先,我不会将密码存储在 NSUserDefaults 中。我宁愿使用钥匙串。

这是在 NSUserDefaults 中保存用户名的方法:

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

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

另一方面,使用钥匙串的一种简单方法是使用SSKeychainSam Soffes 的类;在这种情况下,您只需说:

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

[SSKeychain setPassword:password forService:@"YOUSERVICENAMEHERE" account:username];
于 2012-09-06T10:59:33.720 回答
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];
    }
}

你可以像这样检索它们:

-(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;
}
于 2012-09-06T10:54:08.303 回答
0

无法设置 NSUserDefaults 字段

从链接发布我的代码以确保即使将来删除或删除上述帖子,答案对社区仍然有用。

代码:

你可以试试这段代码。我非常确定它会为您工作。

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

要检索数据,您应该使用以下代码:

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

或者

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

编辑:

如果它仍然给出nil,那么您可以使用以下代码:

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

或者

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

在上面的链接中,您会找到我的答案,并将我的代码中的“init_val”替换为您的“用户名”和“密码”作为键

希望这对您有所帮助。

于 2012-09-06T11:02:16.883 回答
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
于 2017-08-18T09:22:23.357 回答