Touch ID不存储用户的任何指纹图像,只保存代表指纹的数字字符。iPhone 5s的A7处理器采用了新的高级安全架构,其中有一块名为Secure Enclave的区域用以专门保护密码和指纹数据。只有Secure Enclave可以访问指纹数据,而且它还把这些数据同处理器和系统隔开,因而这些永远不会被存储在苹果的服务器上,也不会被同步到iCloud或其他地方。除了Touch ID之外,它们不会被匹配到其他指纹库中。
作为程序员, 我们大可不必关心上述的硬件原理, 苹果工程师们已经为我们封装号了API, 我们只需要调用就是了.
其实TouchID指纹验证只涉及到了下面两个方法:
1: 检测硬件是否支持, TouchID你都没有, 你还指纹验证, 验证个毛线呀~
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
2: 持续地进行"扫描"指纹, 直到成功, 或者三次失败而进行下一次扫描, 成功或失败, 都在这个方法的Block中进行处理:
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
其中localizedReason是在系统弹框中的提示语:
这两个方法都在LocalAuthentication.h中定义的, 所以需要在你得App中添加指纹验证的时候, 必须要导入下面的头文件:
#import <LocalAuthentication/LocalAuthentication.h>
下面给个简单的验证栗子, 只是对验证结果的简单打印显示, 未作任何业务逻辑处理:
// 初始化上下文
LAContext *context = [[LAContext alloc] init];
NSError *error = nil;
// 认证出错时, 在系统弹框中的提示语
NSString *str = @"请继续扫描你得指纹";
// 检测设备是否有TouchID
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 设备有TouchID
// 认证成功或失败之前, 会持续进行认证操作
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:str reply:^(BOOL success, NSError *error) {
if (success) { // TouchID存在, 并认证成功
NSLog(@"认证成功");
if (!success) {
NSLog(@"%@", error);
}
} else { // TouchID存在, 但认证失败
NSLog(@"认证失败");
if (!success) {
NSLog(@"%@", error);
}
}
}];
} else { // 设备没有TouchID
NSLog(@"发生了一个错误");
if (error) {
NSLog(@"%@", error);
}
}
源码下载