APP中指纹识别(TouchID) 设置类似支付宝指纹解锁的功能

最近APP中需要加指纹解锁的功能,就是类似支付宝的指纹解锁,具体可以到支付宝操作一下,在此就不贴图了。

首先,如果之前没做过指纹识别解锁的同学可以先看一下这篇文章,文章写得挺全面的: 点击打开链接

直接贴代码了,以下是单独封装的一个指纹识别的工具类,可以在使用时直接调用(iOS9及以上系统):

//
//  FingerprintManager.swift
//  JiuLiFunds
//
//  Created by yangyunfei on 2018/1/23.
//  Copyright © 2018年 JiuLiFunds. All rights reserved.
//

//指纹解锁

import UIKit
import LocalAuthentication

class FingerprintManager: NSObject {

    enum XWCheckResult: NSInteger {
        case success             //成功
        case failed              //失败
        case passwordNotSet      //未设置手机密码
        case touchidNotSet       //未设置指纹
        case touchidNotAvailable //不支持指纹
        case cancleSys           //系统取消
        case canclePer           //用户取消
        case inputNUm            //输入密码
        case touchIDLockout   //输入次数过多验证被锁
    }
    
    static func userFingerprintTipStr(withtips tips:String, withIsPwdBtn:Bool , block : @escaping (_ result :XWCheckResult) -> Void){
        if #available(iOS 9.0, *) { //iOS 版本判断 低版本无需调用
            let context = LAContext()//创建一个上下文对象
            if !withIsPwdBtn {
                 context.localizedFallbackTitle = "" //设置为空,再试一次的alertVC中没有右边的输入密码按钮
            }else {
                context.localizedFallbackTitle = "验证手势密码"
            }
            var error: NSError? = nil//捕获异常
            if(context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)){//判断当前设备是否支持指纹解锁
                //指纹解锁开始
                context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason:tips, reply: { (success, error) in
                    
                    if(success){
                        if context.evaluatedPolicyDomainState != nil {
                            //指纹验证成功
                            print("指纹验证成功")
                            block(XWCheckResult.success)
                        }else{
                            print("系统密码输入成功")
                        }
                        
                    }else{
                        let laerror = error as! LAError
                        switch laerror.code {
                        case LAError.authenticationFailed:
                            print("连续三次输入错误,身份验证失败。")
                            block(XWCheckResult.failed)
                            break
                        case LAError.userCancel:
                            print("用户点击取消按钮。")
                            block(XWCheckResult.canclePer)
                            break
                        case LAError.userFallback:
                            print("用户点击输入密码。")
                            block(XWCheckResult.inputNUm)
                            break
                        case LAError.systemCancel:
                            print("系统取消")
                            block(XWCheckResult.cancleSys)
                            break
                        case LAError.passcodeNotSet:
                            print("用户未设置密码")
                            block(XWCheckResult.passwordNotSet)
                            break
                        case LAError.touchIDNotAvailable:
                            print("touchID不可用")
                            block(XWCheckResult.touchidNotAvailable)
                            break
                        case LAError.touchIDNotEnrolled:
                            print("touchID未设置指纹")
                            block(XWCheckResult.touchidNotSet)
                            break
                        case LAError.touchIDLockout:
                            print("touchID输入次数过多验证被锁")
                            block(XWCheckResult.touchIDLockout)
                            FingerprintManager.unlockTouchID()
                            break
                        default: break
                        }
                    }
                })
                
            }else{
                print("不支持或者验证次数过多已被锁定");
                FingerprintManager.unlockTouchID()
            }
        }
    }


/// 检查手机 TouchID 功能是否开启或可以使用
var isSupportTouchID: Bool {
    get {
        let context = LAContext()
        var error :NSError?
        let isSupport = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)
        //自定义的
        if #available(iOS 9.0, *) {
            return isSupport
        }else {//ios9以下
            return false
        }
    }
}

   //解锁次数过多被锁之后,调用系统的开机解锁密码
  static  func unlockTouchID() {
        let context = LAContext();
        var authError: NSError? = nil;
        if #available(iOS 9.0, *) {
            if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
                context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "需要您的密码,才能启用 Touch ID", reply: { (success, evaluateError) in
                    if success {
                        // Touch ID 解锁成功
                    }
                })
            }
        } else {
            //
        }
    }
    
}

调用:

FingerprintManager.userFingerprintTipStr(withtips: "通过验证手机已有指纹解锁",withIsPwdBtn:false , block: { (result:FingerprintManager.XWCheckResult) in
                                switch result{
                                case .success:
                                    print("用户解锁成功")
                                    //进行操作,回到主线程,否则可能会有延时
                                   
                                    break
                                case .failed:
                                    print("连续三次输入错误,身份验证失败。")
                                    DispatchQueue.main.async(execute: {
                                        CustomProgressHUD.showTip(onHUD: "指纹解锁失败")
                                    })
                                    break
                                case .passwordNotSet:
                                    print("未设置密码")
                                    break
                                case .touchidNotSet:
                                    print("未设置指纹")
                                    break
                                case .touchidNotAvailable:
                                    print("系统不支持")
                                    break
                                case .touchIDLockout:
                                    print("touchID输入次数过多验证被锁")
                                    break
                                default:
                                    break
                                }
                     
                            })

注意:iOS9之后指纹输入次数过多之后,需要自己写代码调用系统的开机解锁密码(可以调用工具类中unlockTouchID方法)。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值