如何将 Touch ID 与 NSUserDefaults 结合使用?
Posted
技术标签:
【中文标题】如何将 Touch ID 与 NSUserDefaults 结合使用?【英文标题】:how to use Touch ID with respective to NSUserDefaults? 【发布时间】:2015-02-23 21:54:10 【问题描述】:我已将 Touch id 集成到我的应用程序中,过程开始如下 -
1.当用户启动应用程序时,将调用 Authenticaion.m 中的 View 方法,然后它要求用户使用触摸 ID 进行身份验证,并显示一个带有“输入密码”和“取消”的警报对话框。
2.如果这是用户第一次登录,他将选择使用手指进行身份验证,然后 Login.m 将显示在用户名和密码文本字段中,他必须在其中输入凭据才能登录。
3.他也可以选择“输入密码”或“取消”,这将带他进入login.m,在那里他将输入他的用户名和密码进行身份验证。
4.如果用户登录应用程序并从后台状态退出应用程序并尝试登录应用程序,那么由于他没有注销应用程序,他将显示相同的视图将出现方法如果他使用手指进行身份验证,无需输入用户名和密码进行身份验证,直接登录,现在另一种情况是,如果他再次选择“输入密码”或按“取消”,他将被带到 login.m 文件,他必须在其中输入用户名和密码。
5.如果用户使用上述任何一种方式登录应用程序并退出应用程序并再次尝试登录,则重复步骤1的所有过程。我想实现上述功能。
我的疑问是,在 LAContext 的成功块中,我需要如何存储 nsUserDefaults 的 txtUsername 和 txtPassword 以便应用程序识别出用户没有从应用程序中注销并且一旦他从后台删除应用程序并且再次尝试登录并使用他的手指,他将直接登录到应用程序。请参阅我在 authentication.m 和 login.m 中使用的以下代码。请让我知道如何解决这个问题,因为我上周一直在努力解决这个问题。
-(void)viewWillAppear:(BOOL)animated
dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.75 * NSEC_PER_SEC), highPriorityQueue, ^
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Please Authenticate To Proceed";
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError])
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error)
if (success)
NSString *result = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"txtUserName"];
SignInViewController *user = [[SignInViewController alloc]init];
if ([result isEqualToString:@"rthottempudi" ] )
NSLog(@"User is authenticated successfully");
dispatch_async(dispatch_get_main_queue(), ^
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"Main" bundle:[NSBundle mainBundle]];
ViewController *congoView = [storyboard instantiateViewControllerWithIdentifier:@"CongratsViewController"];
[self presentViewController:congoView animated:YES completion:nil];
);
else
dispatch_async(dispatch_get_main_queue(), ^
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authentication Failed"
message:@"PLease Try Again"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alertView show];
NSLog(@"failed");
);
else
switch (error.code)
case LAErrorAuthenticationFailed:
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authentication Failed"
message:@"Please Try Again"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alertView show];
NSLog(@"Authentication Failed");
break;
case LAErrorUserCancel:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"Main" bundle:[NSBundle mainBundle]];
SignInViewController *congoView = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:congoView animated:YES completion:nil];
NSLog(@"User pressed Cancel button");
break;
case LAErrorUserFallback:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"Main" bundle:[NSBundle mainBundle]];
SignInViewController *congoView = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:congoView animated:YES completion:nil];
NSLog(@"User pressed \"Enter Password\"");
break;
default:
NSLog(@"Touch ID is not configured");
break;
NSLog(@"Authentication Fails");
];
else
// if the device doesn't have touch id
dispatch_async(dispatch_get_main_queue(), ^
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"Main" bundle:[NSBundle mainBundle]];
SignInViewController *congoView = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:congoView animated:YES completion:nil];
);
);
【问题讨论】:
【参考方案1】:不要在 UserDefaults 上存储私人数据,
不是在钥匙串中存储用户名和密码,而是在 UserDefaults 中存储 TouchIDEnabled 值(真/假)。
如果 TouchIdEnabled 为 true,则请求 touchId。
如果 touchID 成功,从钥匙串中读取用户名-密码。
【讨论】:
以上是关于如何将 Touch ID 与 NSUserDefaults 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章
在不存储用户生物特征的情况下使用 Touch ID 或 Face ID