我正在尝试获取以下功能中的Face ID或Touch ID是否成功
func authenticate() -> Bool{ let context = LAContext() var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { return false } var returnValue = false let reason = "Face ID authentication" context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { isAuthorized, error in guard isAuthorized == true else { return print(error) } returnValue = true print("success") } return returnValue }
但是即使此代码成功执行,它也会跳过returnValue = true稍后传递,从而导致错误的返回。为什么会这样?以及如何解决此代码以使其像预期的那样工作?
returnValue = true
Touch ID和Face ID LocalAuthentication的工作代码 (swift 4代码)
注意: 隐私-面部ID使用描述 键添加到Info.plist中
用
self.Authenticate { (success) in print(success) }
本地认证功能
func Authenticate(completion: @escaping ((Bool) -> ())){ //Create a context let authenticationContext = LAContext() var error:NSError? //Check if device have Biometric sensor let isValidSensor : Bool = authenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) if isValidSensor { //Device have BiometricSensor //It Supports TouchID authenticationContext.evaluatePolicy( .deviceOwnerAuthenticationWithBiometrics, localizedReason: "Touch / Face ID authentication", reply: { [unowned self] (success, error) -> Void in if(success) { // Touch / Face ID recognized success here completion(true) } else { //If not recognized then if let error = error { let strMessage = self.errorMessage(errorCode: error._code) if strMessage != ""{ self.showAlertWithTitle(title: "Error", message: strMessage) } } completion(false) } }) } else { let strMessage = self.errorMessage(errorCode: (error?._code)!) if strMessage != ""{ self.showAlertWithTitle(title: "Error", message: strMessage) } } }
使用消息处理错误代码
//MARK: TouchID error func errorMessage(errorCode:Int) -> String{ var strMessage = "" switch errorCode { case LAError.Code.authenticationFailed.rawValue: strMessage = "Authentication Failed" case LAError.Code.userCancel.rawValue: strMessage = "User Cancel" case LAError.Code.systemCancel.rawValue: strMessage = "System Cancel" case LAError.Code.passcodeNotSet.rawValue: strMessage = "Please goto the Settings & Turn On Passcode" case LAError.Code.touchIDNotAvailable.rawValue: strMessage = "TouchI or FaceID DNot Available" case LAError.Code.touchIDNotEnrolled.rawValue: strMessage = "TouchID or FaceID Not Enrolled" case LAError.Code.touchIDLockout.rawValue: strMessage = "TouchID or FaceID Lockout Please goto the Settings & Turn On Passcode" case LAError.Code.appCancel.rawValue: strMessage = "App Cancel" case LAError.Code.invalidContext.rawValue: strMessage = "Invalid Context" default: strMessage = "" } return strMessage }
显示警报消息
//MARK: Show Alert func showAlertWithTitle( title:String, message:String ) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) let actionOk = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(actionOk) self.present(alert, animated: true, completion: nil) }