Touch ID
Touch
ID是iPhone5S后加入的一項(xiàng)新的功能,也就是大家熟知的指紋識(shí)別技術(shù)哈打。大家用得最多的可能是手機(jī)的解屏操作,不用在和以前一樣輸入手機(jī)的四位數(shù)密
碼進(jìn)行驗(yàn)證讯壶。一方面不用擔(dān)心密碼被別人看到料仗,另一方面也方便了自己的操作。iOS8后蘋果開(kāi)放了Touch
ID的API給開(kāi)發(fā)者伏蚊,這也給我們的app帶來(lái)了新的體驗(yàn)立轧。
使用
Touch ID的API非常的簡(jiǎn)單也好理解,在使用前我們需要導(dǎo)入LocalAuthentication這個(gè)庫(kù)躏吊。
1.png
首先來(lái)看下頭文件的定義:
//驗(yàn)證設(shè)備是否支持Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError* __autoreleasing *)error;
//進(jìn)行驗(yàn)證的回調(diào)
- (void)evaluatePolicy:(LAPolicy)policy? ? ? localizedReason:(NSString*)localizedReason? ? ? ? ? ? ? ? reply:(void(^)(BOOLsuccess,NSError*error))reply;
//取消Touch Id驗(yàn)證的按鈕的標(biāo)題氛改,默認(rèn)標(biāo)題是輸入密碼@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}
這樣我們就完成了一個(gè)Touch ID的驗(yàn)證功能。當(dāng)我們點(diǎn)擊按鈕進(jìn)行調(diào)用的時(shí)候比伏,就會(huì)彈出驗(yàn)證的對(duì)話框:
2.png
彈窗目前還不能自定義胜卤,都是統(tǒng)一的,第一行是app的名字+Touch ID赁项, 第二行是需要用Touch ID的理由葛躏。在用戶進(jìn)行操作后,我們可以在回調(diào)的block那邊處理自己的業(yè)務(wù)邏輯悠菜。
錯(cuò)誤處理
typedefNS_ENUM(NSInteger, LAError){//用戶驗(yàn)證沒(méi)有通過(guò)舰攒,比如提供了錯(cuò)誤的手指的指紋LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,// 用戶取消了Touch ID驗(yàn)證LAErrorUserCancel? ? ? ? ? = kLAErrorUserCancel,//用戶不想進(jìn)行Touch ID驗(yàn)證,想進(jìn)行輸入密碼操作
LAErrorUserFallback? ? ? ? = kLAErrorUserFallback,// 系統(tǒng)終止了驗(yàn)證
LAErrorSystemCancel? ? ? ? = kLAErrorSystemCancel,// 用戶沒(méi)有在設(shè)備Settings中設(shè)定密碼LAErrorPasscodeNotSet? ? ? = kLAErrorPasscodeNotSet,// 設(shè)備不支持Touch IDLAErrorTouchIDNotAvailable? = kLAErrorTouchIDNotAvailable,// 設(shè)備沒(méi)有進(jìn)行Touch ID 指紋注冊(cè)
LAErrorTouchIDNotEnrolled? = kLAErrorTouchIDNotEnrolled,}NS_ENUM_AVAILABLE(10_10,8_0);
在block回調(diào)那邊悔醋,我們需要對(duì)每種錯(cuò)誤進(jìn)行處理摩窃,以便得到更好的用戶體驗(yàn)。
例
#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:@"指紋識(shí)別" 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請(qǐng)求驗(yàn)證" reply:^(BOOL success, NSError * _Nullable error) {
if (success)
{
NSLog(@"驗(yàn)證成功");
}
switch (error.code)
{
case LAErrorSystemCancel:
NSLog(@"切換到其它app,系統(tǒng)取消驗(yàn)證");
break;
case LAErrorUserCancel:
NSLog(@"用戶取消驗(yàn)證");
break;
case LAErrorUserFallback:
NSLog(@"用戶選擇輸入密碼篙顺,切換主線程處理");
break;
}
}];
}
if (error)
{
NSLog(@"%@",error.localizedDescription);
}
}
}