let deviceType = LAPolicy.deviceOwnerAuthenticationWithBiometrics
// 单纯指纹或FaceID,LAPolicyDeviceOwnerAuthentication会有密码验证
let context = LAContext()
var error: NSError?
let isSupport = context.canEvaluatePolicy(deviceType, error: &error)
三、指纹识别
context.evaluatePolicy(deviceType, localizedReason: desc ?? message) { success, error in
if success == true {
DispatchQueue.main.async {
block(.success, nil)
}
} else {
let state = authFail(error: error)
DispatchQueue.main.async {
block(state, error)
}
}
}
四、错误状态
private static func authFail(error: Error?) -> GXTouchIDState {
guard let c = error as? NSError else {
return .notSupport
}
let cc = LocalAuthentication.LAError.Code.init(rawValue: c.code)
var state: GXTouchIDState = .fail
switch cc {
case LocalAuthentication.LAError.authenticationFailed:
print("授权失败")
state = .fail
case LocalAuthentication.LAError.userCancel:
print("用户取消验证Touch ID")
state = .userCancel
case LocalAuthentication.LAError.userFallback:
print("用户选择输入密码,切换主线程处理")
state = .inputPassword
case LocalAuthentication.LAError.systemCancel:
print("系统取消授权,如其他APP切入")
state = .systemCancel
case LocalAuthentication.LAError.passcodeNotSet:
print("系统未设置密码")
state = .passwordNotSet
case LocalAuthentication.LAError.biometryNotAvailable:
print("设备Touch ID不可用,例如未打开")
state = .touchIDNotAvailable
case LocalAuthentication.LAError.biometryNotEnrolled:
print("设备Touch ID不可用,用户未录入")
state = .touchIDNotSet
default:
print("其他情况,切换主线程处理")
}
return state
}
五、判断是否有面容识别
public static func haveFaceID() -> Bool {
var haveFaceID = false
let myContext = LAContext()
if myContext.biometryType == .touchID {
} else if myContext.biometryType == .faceID {
haveFaceID = true
}
return haveFaceID
}
控制结构
if 的“快乐路径”原则
针对程序的分支结构,Go 提供了 if 和 switch-case 两种语句形式;而针对循环结构,Go 只保留了 for 这一种循环语句形式。
if 语句
if 语句是 Go 语言中提供的一种分支控制结构,它也是 Go 中最常…