iOS8检查设备是否具有Touch ID

1ce*_*1ce 16 iphone ios touch-id ios8 face-id

LAContext具有检查设备是否可以评估触摸ID并提供错误消息的方法.问题是系统在两种情况下给出了相同的错误消息"LAErrorPasscodeNotSet":

1)如果用户具有Touch ID,但在设置中将其关闭(带iOS8的iPhone 5s)

2)如果设备没有Touch ID(带iOS8的iPad)

问:如何检查设备是否支持Touch ID,但未在设置中打开?

更新:

已经创建了关于这个bug(ID#18364575)的Apple门票,并收到了回答:

" Engineering已根据以下信息确定此问题的行为符合预期:

如果未设置密码,您将无法检测Touch ID的存在.一旦设置了密码,canEvaluatePolicy将最终返回LAErrorTouchIDNotAvailable或LAErrorTouchIdNotEnrolled,您将能够检测Touch ID存在/状态.

如果用户在具有Touch ID的手机上禁用了密码,则他们知道他们将无法使用Touch ID,因此这些应用无需检测Touch ID状态或推广基于Touch ID的功能."

Leg*_*ess 7

也许您可以编写自己的方法来检查您正在运行的设备,因为如果返回的错误相同,则很难确定是否支持Touch ID.我会用这样的东西:

int sysctlbyname(const char *, void *, size_t *, void *, size_t);

- (NSString *)getSysInfoByName:(char *)typeSpecifier
{
    size_t size;
    sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);

    char *answer = malloc(size);
    sysctlbyname(typeSpecifier, answer, &size, NULL, 0);

    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];

    free(answer);
    return results;
}

- (NSString *)modelIdentifier
{
    return [self getSysInfoByName:"hw.machine"];
}
Run Code Online (Sandbox Code Playgroud)

拥有模型标识符后,我只会检查模型标识符是否等于支持Touch ID的模型之一:

- (BOOL)hasTouchID
{
    NSArray *touchIDModels = @[ @"iPhone6,1", @"iPhone6,2", @"iPhone7,1", @"iPhone7,2", @"iPad5,3", @"iPad5,4", @"iPad4,7", @"iPad4,8", @"iPad4,9" ];

    NSString *model = [self modelIdentifier];

    return [touchIDModels containsObject:model];
}
Run Code Online (Sandbox Code Playgroud)

该阵列包含支持Touch ID的所有型号ID,它们是:

  • iPhone 5S
  • iPhone 6
  • iPhone 6+
  • iPad Air 2
  • iPad Mini 3

此方法的唯一缺点是,一旦使用Touch ID发布新设备,模型阵列将不得不手动更新.