iOS开发关于指纹登录和记住密码

    在涉及记住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库;

iOS开发关于指纹登录和记住密码_第1张图片

保存

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的使用和指纹登录基本就实现了,方法写得很简陋,请大家见谅!

你可能感兴趣的:(iOS开发关于指纹登录和记住密码)