[toc]
- [新的博客地址](https://kunnan.blog.csdn.net)
TouchID 指纹识别是IPhone 5s设备新增的一项重大功能,用于数据加密和安全。而在IOS 8.0 以后也向第三方开放了相应功能API
https://developer.apple.com/reference/localauthentication/lacontext?language=objcobjc 语言示例
添加Libraries:LocalAuthentication Framework
Class
LAContext
Preflights an authentication policy to see if it is possible for authentication to succeed.监测设备是否支持TouchID,返回BOOL,并且若不支持,则在error里面返回相应状态
-evaluatePolicy:localizedReason:reply:
Evaluates the specified policy.TouchID验证状态,在block里面返回验证状态(BOOL)和error;
reply:(void(^)(BOOLsuccess, NSError *__nullableerror))reply;
The current state of the evaluated policy domain.
TouchID API 非常简单,仅仅对本设备的TouchID进行验证,但如果需要在app集成相应的 “设备登录/验证”功能或其他TouchID 的应用,则需自行设计关联和绑定流程(例如:设备Token、生成设备账号/密码、app包名/版本),绑定之后,才能使用TouchID 进行验证和应用。
实现的关键点 :进行设备(用户)绑定
由于API并不提供关于本设备或本app任何可关联的信息,所以集成TouchID还需自行设计关联流程,才能实现指纹登录功能,或者指纹支付功能。
开启TouchID指纹密码:进行设备(用户)绑定
关闭TouchID指纹密码: 在设备(用户)绑定之后,并且当前正处于登录状态,也可以将本设备取消绑定,流程基本与绑定流程
设备(指纹)应用:
例如登陆应用: 在设备(用户)绑定之后,并且用户账号退出后,可以使用指纹登录,若当前设备未绑定,则不会出现“指纹登录”按钮。
例子:
指纹登陆app (账号,设备账号/密码)
账户绑定设备(生成设备账号/密码)
开启:在app登录后,点击开启“指纹登录”;
验证TouchID:检测当前设备是否支持TouchID,若支持则发起TouchID验证;
生成设备账号/密码:TouchID验证通过后,根据当前已登录的账号和硬件设备Token,生成设备账号/密码(规则可自定,密码要长要复杂),并保存在keychain;
绑定:生成设备账号/密码后,将原账号及设备账号/密码,加密后(例如RSA加密)发送到服务端进行绑定;
成功:验证原账号及设备账号有效后,返回相应状态,绑定成功则完成整个TouchID(设备)绑定流程。(后台处理逻辑)
设备(指纹)登陆
TouchID登录:在用户登录界面,点击“指纹登录”;
验证TouchID:检测当前设备是否支持TouchID,若支持则发起TouchID验证;
登录:读取app在本机的设备账号/密码,调用设备登录接口,发起登录请求;
成功:验证设备账号/密码后,返回相应状态,登录成功则完成整个TouchID登录流程。(后台处理逻辑)
注意细节:
生成账号/密码只是随机字符,以当前userID 为key,保存在keychain;登录时候根据keychain保存的最近一次登录的userID,获取账号/密码,进行登录
附
检测系统录入了新指纹:evaluatedPolicyDomainState这个属性,每次指纹发生改变的时候,这个值就会变,可以通过这个值的变化来判断
代码示例Expand source
#import
-(IBAction)touchIDClick{
LAContext*context=[[LAContext alloc]init];
NSError*error=nil;
if([contextcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricserror:&error]){
[contextevaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"验证touchID"
reply:^(BOOL success,NSError*error){
if(error){
NSLog(@"操作失败");
return;
}
if(success){
NSLog(@"验证成功");
}else{
NSLog(@"验证失败");
}
}];
}else{
NSLog(@"设备不支持");
}
}