ios8 TouchID检测是否添加了指纹

我深入挖掘苹果的Touch ID,更确切地说是本地authentication器。 截至目前的文件相当稀less。 它主要是这样的:

LAContext *myContext = [[LAContext alloc] init]; NSError *authError = nil; NSString *myLocalizedReasonString = <#String explaining why app needs authentication#>; if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:myLocalizedReasonString reply:^(BOOL success, NSError *error) { if (success) { // User authenticated successfully, take appropriate action } else { // User did not authenticate successfully, look at error and take appropriate action } }]; } else { // Could not evaluate policy; look at authError and present an appropriate message to user } 

从https://developer.apple.com/documentation/localauthentication获取

使用指纹进行身份validation的想法很好。 但是如果我知道密码,我可以在设备上添加指纹。 而且它很容易得到密码,就像你坐在火车旁边的火车上,看着他/她input密码。

我想使用指纹作为安全authentication的一种方式,但是希望能够检测自从我上次请求指纹以来是否添加了新的指纹。

苹果正在为AppStore做这件事。 如果您想要在AppStore中validation事务,并且自上次事务后添加了新的指纹,则AppStore会请求您的AppleId密码。 这是一种理智的行为,因为手机可能已经被知道密码的其他人拿走,并且添加了自己的指纹来购买昂贵的东西。

我的问题:我可以检测自上次使用本地身份validation器以来是否添加了新的指纹吗?

简而言之; 没有。

再详细一点, LocalAuthentication框架是一个严密保护的黑匣子。 你从中得到的信息是非常有限的。 你与它的交互是这样的:

  • 询问它是否能够针对某种types的政策进行身份validation(写作时只有1个可用 – 生物识别技术(Touch ID))
  • 如果可以的话,要求它实际做到这一点
  • 系统接pipe实际的authentication
  • 它可以让你知道,如果authentication是否成功(如果没有,它告诉你为什么)

您没有实际身份validation过程的概念(例如使用哪个手指)。 这当然是devise的。 苹果公司不希望也不需要让你访问这些信息。

这现在可以在iOS9中使用。 已评估的PolicyPolicyDomainState属性已添加到LAContext中。

如果指纹数据库被修改(手指被添加或移除),evaluatePolicyDomainState返回的数据将会改变。 更改的性质无法确定,但通过比较evaluatePolicyDomainState在不同evaluatePolicy调用后的数据,您可以检测到指纹集已被修改。

请注意,只有在调用evaluatePolicy并执行了成功的Touch ID身份validation或者canEvaluatePolicy成功执行生物特征识别策略时,才会设置此属性。

正如基思所说,在iOS 9中是可能的。 你应该这样做。

  let context = LAContext() context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil) if let domainState = context.evaluatedPolicyDomainState where domainState == oldDomainState { // Enrollment state the same } else { // Enrollment state changed } 

每次添加或删除指纹时,域状态都会改变。 您需要调用canEvaluatePolicy for evaluatedPolicyDomainState进行更新。

这是objective-c中的代码,用于validation是否添加或删除了指纹。

  - (void)evaluatedPolicyDomainState { LAContext *context = [[LAContext alloc] init]; __block NSString *message; // show the authentication UI with reason string [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Unlock access to locked feature" reply:^(BOOL success, NSError *authenticationError) { if (success) { // load the last domain state from touch id NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *oldDomainState = [defaults objectForKey:@"domainTouchID"]; NSData *domainState = [context evaluatedPolicyDomainState]; // check for domain state changes if ([oldDomainState isEqual:domainState]) { message = @"nothing change."; } else { message = @"domain state was changed!"; } // save the domain state that will be loaded next time oldDomainState = [context evaluatedPolicyDomainState]; [defaults setObject:oldDomainState forKey:@"domainTouchID"]; [defaults synchronize]; } else { message = [NSString stringWithFormat:@"evaluatePolicy: %@", authenticationError.localizedDescription]; } [self printMessage:message inTextView:self.textView]; }]; }