我需要在NSUserDefault中保存用户名和密码。我打算在IB中放置一个圆形的矩形按钮。在按下时,用户名和密码将保存在NSUserDefault中,这样当用户杀死应用程序并尝试在一段时间后再次登录时,他们不需要再次输入他们的登录详细信息。 任何帮助都将受到高度赞赏。
谢谢和最诚挚的问候,
PC
答案 0 :(得分:7)
保存用户名和密码我个人建议使用Keychain
,因为NSUserDefault
存储数据,因此它们在安全性方面比Keychain
更安全加密形式,而NSUserDefault
存储为纯文本。如果您仍想使用NSUserDefault
这就是
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"];
答案 1 :(得分:4)
不要将明文密码存储在用户默认值中,即使它们不重要。
使用Keychain Services。 Generic Keychain Sample提供了示例KeychainWrapper类,可用于读取和写入数据到钥匙串,其中setObject:forKey:
接口与NSUserDefaults
使用的接口完全相同。
答案 2 :(得分: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"];
答案 3 :(得分: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];
答案 4 :(得分: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;
}
答案 5 :(得分:0)
Cannot set NSUserDefaults field
从链接发布我的代码,以确保即使上述帖子将来被删除或删除,答案仍然对社区有用。
<强>代码:强>
您可以尝试使用此代码。我很确定它会对你有用。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=@"1";
[defaults setObject:uid forKey:@"init_val"];
[defaults synchronize];
要检索数据,请使用以下代码:
NSString *initVal=[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"];
OR
NSString *initVal=[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"];
修改强>
如果仍然提供nil
,则可以使用以下代码:
NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]];
OR
NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]];
在上面的链接中,您将找到我的答案,并在我的代码中将“init_val”替换为“username”和“password”作为键
希望这会对你有所帮助。
答案 6 :(得分: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