【Swift3】指纹解锁

作者: 亲爱的大倩倩 | 来源:发表于2017-05-15 15:48 被阅读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

    相关文章

      网友评论

        本文标题:【Swift3】指纹解锁

        本文链接:https://www.haomeiwen.com/subject/xojhxxtx.html