【Swift3】指纹解锁

项目说明

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好久没写文章了,最近也比较偷懒,今天继续讨论我实际开发中遇到的需求,那就是关于APP解锁,大家都知道。现在越来越多...
    青蛙要fly阅读 3,147评论 2 26
  • 简述: 在类似支付宝为首的应用以及各种理财等涉及钱财对安全性要求较高的应用中,目前普遍对关键数据都做了安全访问限制...
    C_HPY阅读 3,036评论 0 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 知识盲点: OOP 面向对象编程(Object Oriented Programming,OOP) Unified...
    半纸渊阅读 1,200评论 0 0
  • 常用模块 fs模块 文件读取 异步读取文件内容fs.readFile("1.txt", "utf-8", func...
    big5阅读 376评论 0 0