iOS开发之TouchId

来源:互联网 发布:图案编辑软件 编辑:程序博客网 时间:2024/05/22 11:31

// 需求: 通过touchId进行登录,我把账号与密码使用keychain存储了

LoginViewModel

// 这里只是登录请求的例子

- (void)requestLoginStart {
// 这里进行网络请求,登录成功,返回结果
if(succ) {
// 使用keychain存储登录密码
[PassWordTool savePassWord:self.password];
}

引入 #import “PassWordTool.h”

LoginVC.m


- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];if ([user objectForKey:@"isRemeberID"]) { // 这个isRemeberID 是否记住账号    self.phoneNumberTextField.text = [user objectForKey:@"remberID"];    //  调用    [self touchIDManager:^(BOOL succ, NSString *error) {        if (succ) {            self.loginViewModel.password = self.pass;            [[self.loginViewModel requestLoginStart] subscribeNext:^(id x) {            //  如果登录成功,去到主界面                return [UIApplication sharedApplication].cutToMainWindow;            }];        }    }];}

}

-(void)touchIDManager:(void(^)(BOOL succ,NSString * error))block{

NSDictionary * dic = [self arrayForLoaclForMobile:[self.phoneNumberTextField.text removeAllSpaceForString]];if (dic.allValues.count && [dic[@"Touch_STATUS"] isEqualToString:@"1"]) {    [self createTouchForHanderBlock:^(BOOL success, NSInteger errCode, NSString *error) {        if (success) {            [self touchIDLoginCtrl];            NSUserDefaults *user = [NSUserDefaults standardUserDefaults];            [user setBool:success forKey:@"Touch_hander"];            [user synchronize];            block(success,nil);        }else{            [self.view makeToast:error duration:2.0f position:@"center"];        }    }];}

}
-(void)touchIDLoginCtrl{
NSDictionary * dic = [self arrayForLoaclForMobile:[self.phoneNumberTextField.text removeAllSpaceForString]];
self.mob = dic[@”Touch_MOBILE”];
self.pass = dic[@”Touch_Pass”];
}

// 引入#import

UIViewController+BaseCategory.m


#define dispatch_main_async__safe(block)\
if ([NSThread isMainThread]) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}

@implementation UIViewController (DHBaseCategory)

// touchIdAction
-(void)createTouchForHanderBlock:(void(^)(BOOL success, NSInteger errCode, NSString * error))reply{

LAContext *context = [[LAContext alloc]init];context.localizedFallbackTitle = @"输入密码";NSError *error = nil;if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics            localizedReason:@"请验证您的指纹"                      reply:^(BOOL success, NSError * _Nullable error) {                          if(success){                              dispatch_main_async__safe(^{                                  reply(success,0,nil);                              });                          }else{                              NSString * errorString = nil;                              switch (error.code) {                                  case LAErrorAuthenticationFailed:                                      errorString = @"用户身份验证失败";                                      break;                                  case LAErrorUserCancel:                                      errorString = @"您已取消";                                      break;                                  case LAErrorPasscodeNotSet:                                      errorString = @"密码在设备上没有设置";                                      break;                                  case LAErrorTouchIDNotAvailable:                                      errorString = @"touid在设备上不可用";                                      break;                                  case LAErrorTouchIDNotEnrolled:                                      errorString = @"没有登记的手指在触摸";                                      break;                                  default:                                      errorString = @"请稍候重试";                                      break;                              }                              dispatch_main_async__safe(^{                                  reply(success,error.code,errorString);                              });                          }                      }];}else{    dispatch_main_async__safe(^{        reply(NO,-100,@"您的设备不支持TouchID");    });}

}

//touchID 开关

-(void)updateDataSourceAndControlForSave:(BOOL)isSave AndPwd:(NSString *)pwd{

NSDictionary * dic;if (isSave) {    //  这里的 Touch_STATUS  是touchid的状态    dic = @{            @"Touch_MOBILE" : [DHAccountModel shareAccount].custLogin,            @"Touch_Pass"  : pwd,            @"Touch_STATUS" : @"1"             };}else{    dic = @{            @"Touch_MOBILE" : [DHAccountModel shareAccount].custLogin,            @"Touch_Pass"  : @"",            @"Touch_STATUS" : @"0"            };}[self setTouchIDStatusForLocal:dic];

}

-(void)setTouchIDStatusForLocal:(NSDictionary *)dic{

NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];NSArray * array =  [userDefault objectForKey:K_TOUCHID_LOCALSAVE_KEY];NSMutableArray * mutaleArray  = [NSMutableArray arrayWithArray:array];//从本地读取mobileNSDictionary * resultDic = [self arrayForLoaclForMobile:[DHAccountModel shareAccount].custLogin];if (resultDic) {    [mutaleArray removeObject:resultDic];}[mutaleArray addObject:dic];[userDefault setObject:[mutaleArray copy] forKey:K_TOUCHID_LOCALSAVE_KEY];[userDefault synchronize];

}

-(NSDictionary )arrayForLoaclForMobile:(NSString )mobile{

NSMutableArray * mutaleArray = [[self getTouchIDStatusForLocal] mutableCopy];__block NSDictionary * resultDic = nil;[mutaleArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {    NSDictionary * dic = (NSDictionary *)obj;    if ([dic[@"Touch_MOBILE"] isEqualToString:mobile]) {        resultDic = dic;    }}];return resultDic;

}
-(NSArray *)getTouchIDStatusForLocal{
NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];
return [userDefault objectForKey:K_TOUCHID_LOCALSAVE_KEY];
}

0 0
原创粉丝点击