傲视苍穹iOS《Swift》VIP专题SWIFTiOS Developer

【Swift3】指纹解锁

2017-05-15  本文已影响528人  亲爱的大倩倩

项目说明

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

上一篇下一篇

猜你喜欢

热点阅读