【问题标题】:Check FaceID is enabled or not检查 FaceID 是否启用
【发布时间】:2019-01-04 10:49:15
【问题描述】:

我想获取设备中当前使用的锁类型的字符串,无论是 FaceID、touchID 还是 PassCode。以下是我的代码:-

func getBiometricType() -> String {
    var biometricType: Global.BiometricType {
        let context = LAContext()
        var error: NSError?
        guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else { return .none }
        if #available(iOS 11.0, *) {
            switch context.biometryType {
                case .touchID:
                    return .touchID
                case .faceID:
                    return .faceID
                case .none:
                    return .none
            }
        } else {
            guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else { return .none }
            return context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) ?
     .touchID : .PIN
        }
    }
    return biometricType.rawValue
}

但是这个 canEvaluatePolicy 只检查设备是否支持生物识别。即使 FaceID 尚未设置但启用了密码,它也不会提供有关密码的信息。因为我需要显示启用的类型是“密码”。有什么方法可以实现吗?

【问题讨论】:

    标签: ios swift biometrics face-id passcode


    【解决方案1】:

    你必须使用LAPolicy.deviceOwnerAuthenticationWithBiometrics

    根据苹果文档:

    如果 Touch ID 或 Face ID 不可用或未注册,政策 评估失败。三个不成功的 Touch ID 或 Face ID 后 连续尝试,策略评估将失败。 Touch ID 和 Face 五次尝试失败后,身份验证被禁用, 要求用户输入设备密码才能 重新启用。

    LAPolicy.deviceOwnerAuthentication 启用:

    如果 Touch ID 或 Face ID 可用、已注册且未禁用,则 用户首先被要求。否则,他们会被要求输入 设备密码。如果未启用设备密码,则策略 评估失败。密码验证在 6 后禁用 不成功的尝试,之间的延迟逐渐增加 他们。

    【讨论】:

    • 如果之后没有注册 FaceID,则 biometricType 也会给出“FaceID”。这是我面临问题的一​​点,因为启用了密码,所以它必须给出 .none 作为回报。