【问题标题】:iOS - Face ID biometric integrationiOS - 面容 ID 生物识别集成
【发布时间】:2017-11-08 15:08:27
【问题描述】:

我已经为我的应用集成/实现了人脸 ID(本地身份验证)身份验证,一切正常,除了人脸 ID 提示警报窗口界面。

它显示的是一个带有浅灰色背景的圆角正方形,标题为“Face” 身份证”

标题上方的空白区域需要设置什么?是人脸ID图标的空间吗?如果是,那么我该如何设置?我已经尝试了 LAContext 和 LAPolicy 中的所有内容。

看看这个快照:

这是我的代码:

    let laContext = LAContext()
    var error: NSError?
    let biometricsPolicy = LAPolicy.deviceOwnerAuthenticationWithBiometrics

    if (laContext.canEvaluatePolicy(biometricsPolicy, error: &error)) {

        if let laError = error {
            print("laError - \(laError)")
            return
        }

        var localizedReason = "Unlock device"
        if #available(iOS 11.0, *) {
            switch laContext.biometryType {
            case .faceID: localizedReason = "Unlock using Face ID"; print("FaceId support")
            case .touchID: localizedReason = "Unlock using Touch ID"; print("TouchId support")
            case .none: print("No Biometric support")
            }
        } else {
            // Fallback on earlier versions
        }


        laContext.evaluatePolicy(biometricsPolicy, localizedReason: localizedReason, reply: { (isSuccess, error) in

            DispatchQueue.main.async(execute: {

                if let laError = error {
                    print("laError - \(laError)")
                } else {
                    if isSuccess {
                        print("sucess")
                    } else {
                        print("failure")
                    }
                }

            })
        })
    }

【问题讨论】:

    标签: ios swift ios11 touch-id face-id


    【解决方案1】:

    这仅在模拟器中发生,在实际设备中,画布被面部图标动画占据。

    localizedReason 仅适用于 Touch ID,因为它们共享相同的 API。

    更新 1:添加屏幕录像:

    他们都运行相同的代码:

    func beginFaceID() {
    
        guard #available(iOS 8.0, *) else {
            return print("Not supported")
        }
    
        let context = LAContext()
        var error: NSError?
    
        guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
            return print(error)
        }
    
        let reason = "Face ID authentication"
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { isAuthorized, error in
            guard isAuthorized == true else {
                return print(error)
            }
    
            print("success")
        }
    
    }
    

    这是 TouchID 和 FaceID 的所有错误代码的工作代码(Swift 4)

    https://stackoverflow.com/a/52093551/10150796

    【讨论】:

    • 能否分享一下实际设备的视觉效果,如果有的话。我只是想确保在我在应用商店部署/上传应用之前,我的应用运行良好,并且用户界面正确。
    【解决方案2】:

    在任何使用生物识别技术的项目中,将 NSFaceIDUsageDescription 密钥包含在应用的 Info.plist 文件中。如果没有此密钥,系统将不允许您的应用使用 Face ID。

    let authContext = LAContext()
            authContext.localizedFallbackTitle = "Use Passcode"
            authContext.localizedCancelTitle = "Cancel"
    
    var authError: NSError?
    
    if authContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
       evaluatePolicy(policy, context: authContext)
    } else {
         guard let error = authError else { return }
         print("Error: \(error.code)")
         checkError(error)
    }
    
    private func evaluatePolicy(_ policy: LAPolicy, context: LAContext) {
            context.evaluatePolicy(policy, localizedReason: reason) { (success, error) in
                if success {
                    print("Success")
    
                } else {
                    guard let error = error else { return }
                    self.checkError(error as NSError)
                }
            }
    }
    
    private func checkError(_ error: NSError) {
        guard let error = error as? LAError else { return }
    
        switch error.code {
        case .authenticationFailed:
            print("authenticationFailed")
            requestAuth(policy: .deviceOwnerAuthentication)
        case .userFallback:
            print("userFallback")
            requestAuth(policy: .deviceOwnerAuthentication)
        case .userCancel:
            print("userCancel")
        case .systemCancel:
            print("systemCancel")
        case .passcodeNotSet:
            print("passcodeNotSet")
        case .appCancel:
            print("appCancel")
        case .invalidContext:
            print("invalidContext")
        case .notInteractive:
            print("notInteractive")
        default:
            checkBioMetricError(error)
        }
    }
    
    private func checkBioMetricError(_ error: LAError) {
        if #available(iOS 11.0, *) {
    
            switch error.code {
            case .biometryNotAvailable,
                 .biometryNotEnrolled,
                 .biometryLockout:
                requestAuth(policy: .deviceOwnerAuthentication)
    
            default: break
            }
        } else {
            switch error.code {
    
            case .touchIDNotAvailable,
                 .touchIDNotEnrolled,
                 .touchIDLockout:
                requestAuth(policy: .deviceOwnerAuthentication)
    
            default: break
            }
        }
    }
    

    【讨论】:

    • 我认为情况并非如此。给定的代码已经适用于 faceid 只是图标丢失了。
    • NSFaceIDUsageDescription。这节省了我的时间。
    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-06-24
    • 2018-12-11
    • 2017-09-12
    相关资源
    最近更新 更多