如果设备支持面部识别或触摸ID ,我想对用户采取不同的操作。
使用面部识别时,iOS会要求使用权限。 (与Touch ID不同)。
如果用户拒绝权限,则context.biometryType返回LABiometryTypeNone。
无论如何都要检查设备支持的触摸ID 或面部识别。
LAContext *context = [[LAContext alloc] init];
NSError *error;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
}
if (@available(iOS 11.0, *)) {
if (context.biometryType == LABiometryTypeFaceID) {
// support FaceID
}
}
// support TouchID
控制台输出
(lldb) po error
Error Domain=com.apple.LocalAuthentication Code=-6 "User has denied the use of biometry for this app." UserInfo={NSLocalizedDescription=User has denied the use of biometry for this app.}
(lldb) po context.biometryType
LABiometryTypeNone
注意:我不想使用密码验证。我只需要知道 设备支持触控ID或面部识别
答案 0 :(得分:1)
使用biometryType
的属性LAContext
来检查和评估可用的生物识别政策。 (对于密码验证,当生物识别失败时,请使用:LAPolicyDeviceOwnerAuthentication
)
试试这个,看看:
LAContext *laContext = [[LAContext alloc] init];
NSError *error;
// For a passcode authentication , when biometric fails, use: LAPolicyDeviceOwnerAuthentication
//if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthentication error:&error]) {
if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
if (error != NULL) {
// handle error
} else {
if (@available(iOS 11, *)) {
if (laContext.biometryType == LABiometryTypeFaceID) {
//localizedReason = "Unlock using Face ID"
NSLog(@"FaceId support");
} else if (laContext.biometryType == LABiometryTypeTouchID) {
//localizedReason = "Unlock using Touch ID"
NSLog(@"TouchId support");
} else {
//localizedReason = "Unlock using Application Passcode"
NSLog(@"No biometric support or Denied biometric support");
}
} else {
// Fallback on earlier versions
}
[laContext evaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Test Reason" reply:^(BOOL success, NSError * _Nullable error) {
if (error != NULL) {
// handle error
} else if (success) {
// handle success response
} else {
// handle false response
}
}];
}
}
答案 1 :(得分:1)
没有。如果用户拒绝使用NSFaceIDUsageDescription
隐私权限提示,则LAContext
的所有后续实例在biometryType
被调用.none
后将会canEvalutePolicy:error:
属性
答案 2 :(得分:0)
为时已晚,但我希望这可以帮助遇到相同问题的任何人。
LAContext()。canEvaluatePolicy(。 deviceOwnerAuthentication ,错误:无) LAContext()。canEvaluatePolicy(。 deviceOwnerAuthenticationWithBiometrics ,错误:无)
deviceOwnerAuthentication 和 deviceOwnerAuthenticationWithBiometrics 之间的区别是,第一个将告诉您设备是否具有身份验证方法..第二个具有相同的行为,但只能被用户接受许可。
enum BiometryResult: Int {
case faceID
case touchID
case notExist
}
class func biometryType() -> BiometryResult {
let context = LAContext()
if (context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)) {
if (context.biometryType == LABiometryType.faceID) {
return .faceID
} else if (context.biometryType == LABiometryType.touchID) {
return .touchID
} else {
return .notExist
}
}
return .notExist
}