我正在尝试获取以下功能中的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
稍后传递,从而导致错误的返回。为什么会这样?以及如何解决此代码以使其像预期的那样工作?
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)
}
问题内容: 是否有任何针对生产的准备就绪的库,用于针对提供的xml文档流XPath表达式评估?我的调查表明,大多数现有解决方案都在评估xpath表达式之前将整个DOM树加载到内存中。 问题答案: 鉴于XPath语法允许:对于完整的XPath实现,这是否可行? 和 这意味着提前要求?也就是说,无论如何,从特定节点开始,您都将不得不加载文档的其余部分。 Nux库(特别是StreamingPathFil
我正在使用Spring WebFlow 2.5.0,但是我的SpEL表达式没有得到正确的计算。我想我一定是做了什么与我的WebFlow配置或SpEL错误,但我不确定哪个。 我的登录流中有以下决策状态。xml: 但是,即使我的方法返回一个Event.success(),我也从未转换到状态。测试结果似乎总是错误的。 是我的SpEL错了,还是我做评估/测试的方式错了?如何调试SpEL评估以查看发生了什么
问题内容: : 1 < 2 < 3 true : 3 > 2 > 1 false … … : 3 > 2 && 2 > 1 true 也许我真的在考虑问题,但是我认为它们都会评估为真。为什么不呢? 问题答案: 因为评估为小于, 但评估为不大于
问题内容: 以下子组件从其父组件接收道具。然后,使用将道具设置为自己的状态,并使用将值渲染到相应的输入字段。 我用来在子组件收到新道具时更新其状态。 最初,调用该组件时,它可以正常工作。问题是第二次通过道具时发生的,触发道具通过的相应按钮需要两次单击才能设置孩子的状态。 我可能使用不正确? 完整代码: 问题答案: 我可能会错误地使用componentWillRecieveProps? 是的,因为您
我在查询两个Oracle数据库时遇到问题。 查询是: (NULL实际上是一个参数,传递给查询,查询可能为空,所以我缩短了查询)。 在生产数据库上,它工作正常,响应为NULL。 在dev DB上,我发现了一个错误,即TRUNC不能应用于NUMBER,需要DATE(ORA-00932)。 显然,生产数据库跳过了OR之后条件中的所有内容,开发人员执行OR之后的部分。 我确实知道通过将CAST(MY_PA
问题内容: 我正在尝试以下代码,该代码向RDD中的每一行添加一个数字,并使用PySpark返回RDD列表。 输入文件(sample.txt)中的内容为: 我期待这样的输出(将rdd中的数字分别添加0、1、2): 而实际输出是: 这意味着无论 范围(4) 为何,该理解仅将值3用于变量i 。 为什么会发生这种现象? 问题答案: 它的发生是由于Python的后期绑定,而不是特定于(Py)Spark的。将