4

我知道 iPhone 5S 上的 Touch ID 不能被任何其他应用程序通过 SDK 使用,但我想看看应用程序是否有可能至少查看设备上是否启用了 Touch ID。这可以作为应用程序查看 iPhone 5S 上是否启用了 Touch ID 的额外安全因素。我知道 MDM 产品可以做到这一点,应用程序是否需要使用特殊的 API 来确定这些信息?

4

4 回答 4

7

您正在寻找的方法是LAContext's canEvaluatePolicy:error:。在以下情况下它会返回 NO :

  • Touch ID 在设备上不可用。
  • 设备上未设置密码。
  • Touch ID 没有注册的手指。

更多信息:本地身份验证框架参考

- (BOOL) isTouchIDAvailable {
    LAContext *myContext = [[LAContext alloc] init];
    NSError *authError = nil;

    if (![myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {

        NSLog(@"%@", [authError localizedDescription]);
        return NO;
    }
    return YES;
}
于 2014-07-23T14:25:24.970 回答
2

我通过以下阶段检查这一点。

  1. iOS < 8.0:

    self.touchIdAvailable = NO;
    
  2. 然后检查设备是否 touchId 可用。

    - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError **)error
    
        if ("canEvaluatePolicy return YES"):{
            self.touchIdAvailable = YES;
            self.osTouchIdStatus = TouchIdSetOK;
        }
    
  3. 检查为什么此设备在错误块中未启用 touchID

        case LAErrorPasscodeNotSet:
        case LAErrorTouchIDNotEnrolled:
    
            self.touchIdAvailable = YES;
            self.osTouchIdStatus = TouchIdNotSet;
    
        break;
    
        default:
            self.touchIdAvailable = NO;
            self.osTouchIdStatus = TouchIdNotSupported;
        break;
    
于 2014-11-07T07:27:42.193 回答
2

由于 TouchID 仅出现在 iPhone 5s 中,因此可以使用以下代码来确定硬件型号:

- (NSString *) checkiPhone5s {
  // Gets a string with the device model
  size_t size;  
  sysctlbyname("hw.machine", NULL, &size, NULL, 0);  
  char *machine = malloc(size);  
  sysctlbyname("hw.machine", machine, &size, NULL, 0);  
  NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];  
  free(machine); 

  if ([platform isEqualToString:@"iPhone6,1"]) {
     // it is iPhone 5s !!!
  }
}

请注意,iPhone 5s 可能有新型号,因此平台字符串将来可能是 "iPhone6,2" , "iPhone6,3"。

或者,如果针对 iPhone 5s 更新了UIDeviceHardware类,则该类可能会提供有用的信息。目前它显示 iPhone 5 的“未知 iPhone”。

于 2013-09-21T03:41:44.353 回答
0

开发人员文档中似乎没有提到任何关于检测设备上是否存在 Touch ID 的内容。绝对有一个私有 API 可以为您提供该信息,但使用它会成为 Apple 不批准您的应用程序的理由。

于 2013-09-21T03:35:13.417 回答