Touch ID
Touch
ID是iPhone5S后加入的一項新的功能,也就是大家熟知的指紋識別技術。大家用得最多的可能是手機的解屏操作,不用在和以前一樣輸入手機的四位數密
碼進行驗證。一方面不用擔心密碼被別人看到,另一方面也方便了自己的操作。iOS8后蘋果開放了Touch
ID的API給開發者,這也給我們的app帶來了新的體驗。
使用
Touch ID的API非常的簡單也好理解,在使用前我們需要導入LocalAuthentication這個庫。
1.png
首先來看下頭文件的定義:
//驗證設備是否支持Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError* __autoreleasing *)error;
//進行驗證的回調
- (void)evaluatePolicy:(LAPolicy)policy? ? ? localizedReason:(NSString*)localizedReason? ? ? ? ? ? ? ? reply:(void(^)(BOOLsuccess,NSError*error))reply;
//取消Touch Id驗證的按鈕的標題,默認標題是輸入密碼@property(nonatomic,copy)NSString*localizedFallbackTitle;
代碼使用示例
LAContext *laContext = [[LAContext alloc] init];
NSError*error;
if([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{? ? ??
[laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics? ? ? ? ? ? ? ? ? ? ? localizedReason:@"Touch Id Test"reply:^(BOOLsuccess,NSError*error) {
if(success)
{NSLog(@"success to evaluate");//do your work}
if(error)
{NSLog(@"---failed to evaluate---error: %@---", error.description);//do your error handle}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }];? ? }
else{NSLog(@"==========Not support :%@", error.description);//do your error handle}
這樣我們就完成了一個Touch ID的驗證功能。當我們點擊按鈕進行調用的時候,就會彈出驗證的對話框:
2.png
彈窗目前還不能自定義,都是統一的,第一行是app的名字+Touch ID, 第二行是需要用Touch ID的理由。在用戶進行操作后,我們可以在回調的block那邊處理自己的業務邏輯。
錯誤處理
typedefNS_ENUM(NSInteger, LAError){//用戶驗證沒有通過,比如提供了錯誤的手指的指紋LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,// 用戶取消了Touch ID驗證LAErrorUserCancel? ? ? ? ? = kLAErrorUserCancel,//用戶不想進行Touch ID驗證,想進行輸入密碼操作
LAErrorUserFallback? ? ? ? = kLAErrorUserFallback,// 系統終止了驗證
LAErrorSystemCancel? ? ? ? = kLAErrorSystemCancel,// 用戶沒有在設備Settings中設定密碼LAErrorPasscodeNotSet? ? ? = kLAErrorPasscodeNotSet,// 設備不支持Touch IDLAErrorTouchIDNotAvailable? = kLAErrorTouchIDNotAvailable,// 設備沒有進行Touch ID 指紋注冊
LAErrorTouchIDNotEnrolled? = kLAErrorTouchIDNotEnrolled,}NS_ENUM_AVAILABLE(10_10,8_0);
在block回調那邊,我們需要對每種錯誤進行處理,以便得到更好的用戶體驗。
例
#import "ViewController.h"#import@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
btn.center=self.view.center;
btn.bounds=CGRectMake(0, 0, 100, 40);
[btn setTitle:@"指紋識別" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
[btn addTarget:self action:@selector(clickTouchId) forControlEvents:UIControlEventTouchUpInside];
}
-(void)clickTouchId
{
CGFloat systemVersion=[UIDevice currentDevice].systemVersion.doubleValue;
if (systemVersion>=8.0)
{
LAContext *context=[[LAContext alloc]init];
NSError *error=nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"XX請求驗證" reply:^(BOOL success, NSError * _Nullable error) {
if (success)
{
NSLog(@"驗證成功");
}
switch (error.code)
{
case LAErrorSystemCancel:
NSLog(@"切換到其它app,系統取消驗證");
break;
case LAErrorUserCancel:
NSLog(@"用戶取消驗證");
break;
case LAErrorUserFallback:
NSLog(@"用戶選擇輸入密碼,切換主線程處理");
break;
}
}];
}
if (error)
{
NSLog(@"%@",error.localizedDescription);
}
}
}