在涉及记住app状态中,比如是否是第一次使用app;很多初学者选择使用NSUserDefaults
NSUserDefaults使用方法也很简单;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
存值
[defaults setObject:@"123" forKey:@"phoneNum"];
defaults setObject:@"111" forKey:@"password"];
[defaults synchronize];
取值
NSString *phoneNum = [defaults objectForKey:@"phoneNum"];
NSString *passwordStr = [defaults objectForKey:@"password"];
但是,使用NSUserDefaults 其实是一个 plist 文件,并不安全;只适合存储少量并不重要的数据;在用户名和密码存储在客户端上,我们可以选择放到系统的KeyChain里面比较安全;
使用KeyChain钥匙串存储密码
从github下载github.com/baptistefetet/KeychainItemWrapper,导入KeychainItemWrapper.h,KeychainItemWrapper.m文件,进行编译,导入Security.framework库;
保存
KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];
[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];
[keyWrapper setObject:@"123" forKey:(id)kSecAttrAccount];// 上面两行用来标识一个Item
[keyWrapper setObject:@"111" forKey:(id)kSecValueData];
读取
KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];
NSString *name =[keyWrapper objectForKey:(id)kSecAttrAccount];
NSString *password=[keyWrapper objectForKey:(id)kSecValueData];
清空数据保存
[wrapper resetKeychainItem];
当然,Keychain也不是绝对安全的,而且即使用户卸载了应用,下次再重装的时候,还是会能读取到之前保存的密码。
指纹识别登录
指纹识别其实是调用手机系统里面的指纹,官方集成了调用方法,使用也非常简单;具体实现如下;
1、导入系统头文件LocalAuthentication/LocalAuthentication.h
2、判断是否支持touchID;
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)
error__attribute__((swift_error(none)));
3、调用方法,实现指纹登录
LAContext *context = [LAContext new]; //这个属性是设置指纹输入失败之后的弹出框的选项
context.localizedFallbackTitle = @"再试一次";
NSError *error = nil;
if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
error:&error]) {
NSLog(@"支持指纹识别");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"按Home键进行指纹登录"reply:^(BOOLsuccess, NSError * _Nullable error) {
if(success) {
NSLog(@"验证成功 刷新主界面");
//这里写登录成功的方法,在这里可以调用keychin ,来获取密码等数据
KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];
NSString *passwordStr=[keyWrapper objectForKey:(id)kSecValueData];//获取指纹保存的密码
.................//具体实现登录的代码
}else{
NSLog(@"%@",error.localizedDescription);
switch(error.code) {
caseLAErrorSystemCancel:
{
NSLog(@"系统取消授权,如其他APP切入");
break;
}
caseLAErrorUserCancel:
{
NSLog(@"取消验证Touch ID");
break;
}
caseLAErrorAuthenticationFailed:
{
NSLog(@"授权失败");
break;
}
caseLAErrorPasscodeNotSet:
{
NSLog(@"系统未设置密码");
break;
}
caseLAErrorTouchIDNotAvailable:
{
NSLog(@"设备Touch ID不可用,例如未打开");
break;
}
caseLAErrorTouchIDNotEnrolled:
{
NSLog(@"设备Touch ID不可用,用户未录入");
break;
}
caseLAErrorUserFallback:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"用户选择输入密码,切换主线程处理");
}];
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"其他情况,切换主线程处理");
}];
break;
}
}
}
}];
}else{
NSLog(@"不支持指纹识别");
switch(error.code) {
caseLAErrorTouchIDNotEnrolled:
{
NSLog(@"TouchID is not enrolled");
break;
}
caseLAErrorPasscodeNotSet:
{
NSLog(@"A passcode has not been set");
break;
}
default:
{
NSLog(@"TouchID not available");
break;
}
}
NSLog(@"%@",error.localizedDescription);
}
好了,keychain的使用和指纹登录基本就实现了,方法写得很简陋,请大家见谅!