我需要保存用户名和密码在NSUserDefault。 我打算把一个圆矩形按钮IB。 在按下其中的用户名和密码将被保存在NSUserDefault,这样当用户关闭应用程序,并尝试一段时间后重新登录,就不需要再次输入登录信息。 任何帮助将高度赞赏。
感谢和问候,
个人计算机
我需要保存用户名和密码在NSUserDefault。 我打算把一个圆矩形按钮IB。 在按下其中的用户名和密码将被保存在NSUserDefault,这样当用户关闭应用程序,并尝试一段时间后重新登录,就不需要再次输入登录信息。 任何帮助将高度赞赏。
感谢和问候,
个人计算机
保存用户名和密码,我会亲自建议用Keychain
,因为它们比更安全NSUserDefault
在安全性方面,因为Keychain
以加密的形式存储数据,而NSUserDefault
存储为纯文本。 如果你仍然想使用NSUserDefault
这里的路
为了节约
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"];
不要明文密码存储在用户的默认设置,即使它们是不重要的。
使用Keychain服务 。 的通用钥匙扣样品提供样品KeychainWrapper类,可以被用于读取和写入数据到钥匙扣完全相同setObject:forKey:
接口NSUserDefaults
用途。
保存:
[[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"];
首先,我不会在存储NSUserDefaults的密码。 我宁愿用钥匙串。
这是如何可以在保存NSUserDefaults的用户名:
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
[standardUserDefaults setObject:myString forKey:@"username"];
NSString* username = [standardUserDefaults objectForKey:@"username"];
在另一方面,使用钥匙链一个简单的方法是使用SSKeychain
山姆Soffes类 ; 在这种情况下,你只是说:
NSString* password = [SSKeychain passwordForService:@"YOUSERVICENAMEHERE" account:username];
[SSKeychain setPassword:password forService:@"YOUSERVICENAMEHERE" account:username];
您可以将您的凭据是这样的:
-(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];
}
}
你可以retrive他们是这样的:
-(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;
}
无法设置现场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”在我的代码中有你的“用户名”和“密码”的钥匙
希望这可以帮助你。
好的答案已经给出,但这里是在钥匙串 保存/载入/删除用户凭据的清洁方式。 考虑这一点,你可以创建一个单独的类,包括下面的代码:
。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