摘要
由于新项目马上启动,看了下需求文档,其中,可能会用到Touch ID或Face ID技术实现支付功能,于是,现做一些技术准备,把学习Touch ID方面的知识做个总结,待真正开发时,应用上去。
开发步骤
首先,touchId功能,用到了苹果自带的LocalAuthentication框架。具体开发步骤如下:
- 判断手机是否支持TouchID功能。
LAContext.init().canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) - 判断验证指纹密码是否成功等
LAContext.init().evaluatePolicy(policy: ***, localizedReason: ***, reply: ***)
它有多个结果 ,如下:
let code = ((eror as NSError?)?.code as? Int32 ) ?? 0
switch code {
case kLAErrorSystemCancel:
print("系统取消授权,如其他APP切入")
case kLAErrorUserCancel:
print("用户取消验证Touch ID")
case kLAErrorAuthenticationFailed:
print("授权失败")
case kLAErrorPasscodeNotSet:
print("系统未设置密码")
case kLAErrorTouchIDNotAvailable:
print("设备Touch ID不可用,例如未打开")
case kLAErrorTouchIDNotEnrolled:
print("设备Touch ID不可用,用户未录入")
case kLAErrorUserFallback:
DispatchQueue.main.async {
print("用户选择输入密码,切换主线程处理")
}
default:
DispatchQueue.main.async {
print("其他情况,切换主线程处理")
}
}
测试写的demo如下:
封封装成一个工具类
/// 指纹识别技术
import UIKit
import LocalAuthentication
class XYJTouchIDTool: NSObject {
static let shareTool = LAContext.init()
override init() {
super.init()
}
///
func openTouchIdFunction() {
var error: NSError?
let version = UIDevice.current.systemVersion as NSString
// iOS 8及以上版本执行-(void)authenticateUser方法,方法自动判断设备是否支持和开启Touch ID
if version.doubleValue > 8.0 {
// Evaluate: 评估,评价
// policy: 政策,方法
// 判断是否可以使用TouchID
let canUseTouchID = XYJTouchIDTool.shareTool.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)
if canUseTouchID {
print("你的设备开启了指纹验证功能");
XYJTouchIDTool.shareTool.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: "这个一般用来描述请求用户提供指纹进行验证的文本提示内容,该内容提示用户为什么需要使用指纹验证的内容---如:利用他解锁(支付)", reply: { (result, eror) in
if result == true { // 判断验证是否成功
print("验证成功")
} else {
let code = ((eror as NSError?)?.code as? Int32 ) ?? 0
switch code {
case kLAErrorSystemCancel:
print("系统取消授权,如其他APP切入")
case kLAErrorUserCancel:
print("用户取消验证Touch ID")
case kLAErrorAuthenticationFailed:
print("授权失败")
case kLAErrorPasscodeNotSet:
print("系统未设置密码")
case kLAErrorTouchIDNotAvailable:
print("设备Touch ID不可用,例如未打开")
case kLAErrorTouchIDNotEnrolled:
print("设备Touch ID不可用,用户未录入")
case kLAErrorUserFallback:
DispatchQueue.main.async {
print("用户选择输入密码,切换主线程处理")
}
default:
DispatchQueue.main.async {
print("其他情况,切换主线程处理")
}
}
}
})
} else {
print("不支持指纹识别")
}
}
}
}