项目说明
1.初次登陆APP时,在设置完手势密码后弹框提示是否打开指纹解锁
手势密码请参见文章:http://www.jianshu.com/p/96c9c4824e6e
2.在设置中,通过UISwitch开关可以打开与关闭指纹解锁
3.若打开了指纹解锁,则每次进入APP时可通过指纹进入
3.APP退至后台10S后,再次进入需要指纹解锁才可进入
思路
在主控制器mainVC中添加完gestureView后,根据本地存储,决定是否需要指纹识别
GestureView中弹窗提示是否加入指纹解锁
//询问是否加入指纹验证
let alertController = UIAlertController(title: "通知", message: "是否使用指纹解锁", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler:
{
(UIAlertAction) -> Void in
print("不加入指纹解锁")
UserDefaults.standard.set(false, forKey: "fingerPrint")
})
let okAction = UIAlertAction(title: "确定", style: .default, handler:
{
(UIAlertAction) -> Void in
print("使用指纹解锁")
UserDefaults.standard.set(true, forKey: "fingerPrint")
})
alertController.addAction(cancelAction)
alertController.addAction(okAction)
self.viewControler().present(alertController, animated: true, completion: nil)
print("获取当前视图的控制器\(self.viewControler())")
若已开启指纹识别,则启动时在mainVC中验证指纹
//要先导入LocalAuthentication
import LocalAuthentication
//指纹解锁
let authenticationContext = LAContext()
var error: NSError?
//步骤1:检查Touch ID是否可用
let isTouchIdAvailable = authenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,error: &error)
//真机上可以使用,模拟器上不可使用
if isTouchIdAvailable
{
print("恭喜,Touch ID可以使用!")
//步骤2:获取指纹验证结果
authenticationContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "需要验证您的指纹来确认您的身份信息", reply:
{
(success, error) -> Void in
if success
{
NSLog("恭喜,您通过了Touch ID指纹验证!")
//回主线程去隐藏View,若是在子线程中隐藏则延迟太厉害
OperationQueue.main.addOperation
{
print("当前线程是\(Thread.current)")
self.gestureView.isHidden = true
}
return
}
else
{
print("抱歉,您未能通过Touch ID指纹验证!\n\(String(describing: error))")
}
})
}
else
{
print("指纹不能用")
}
在设置控制器中通过UISwitch控制指纹识别的开关
//指纹解锁
view.addSubview(fingerPrintSwitch)
fingerPrintSwitch.frame = CGRect(x: 0, y: 0, width: 200, height: 40)
fingerPrintSwitch.center = CGPoint(x: ScreenWidth / 2, y: ScreenHeight / 2 + changeGesturesButton.height)
let fingerPrint = UserDefaults.standard.value(forKey: "fingerPrint")
if ((fingerPrint != nil) && fingerPrint as! Bool)
{
fingerPrintSwitch.isOn = true
}
else
{
fingerPrintSwitch.isOn = false
}
lazy var fingerPrintSwitch : UISwitch = {
let swt = UISwitch()
swt.onTintColor = UIColor.hexStringToColor(hexString: ColorOfBlueColor)
swt.tintColor = UIColor.white
swt.addTarget(self, action: #selector(fingerPrintSwitchAction(swt:)), for: UIControlEvents.valueChanged)
return swt
}()
func fingerPrintSwitchAction(swt:UISwitch)
{
swt.isOn = !swt.isOn
print("现在是打开还是关闭\(swt.isOn)")
if swt.isOn
{
UserDefaults.standard.set(true, forKey: "fingerPrint")
}
else
{
UserDefaults.standard.set(false, forKey: "fingerPrint")
}
}
在进入前台的时候,如果退出时间超过10S,并且开启了指纹解锁,则显示指纹解锁,代码同启动时在mainVC中验证指纹相似
注意1
在指纹解锁中,let authenticationContext = LAContext()最好声明为局部变量
因为在我代码测试中发现,当你验证完指纹后,30S内再次验证,系统会帮我们自动验证,应该是系统会存储指纹的一个有效时间(大概3分钟吧),3分钟内你若再次调用指纹的验证方法,系统自动帮你success
若想每次都验证,要将指纹的那个变量声明为函数内的局部变量,这样每次调用的时候重新初始化,就不会有时间间隔差了
注意2
验证完指纹后,要回主线程去隐藏View,若是在子线程中隐藏则延迟太厉害
Demo地址:
https://github.com/CarolineQian/FQFingerprintIdentification