摘要
由于新項(xiàng)目馬上啟動(dòng),看了下需求文檔稿械,其中搂漠,可能會用到Touch ID或Face ID技術(shù)實(shí)現(xiàn)支付功能作瞄,于是恢着,現(xiàn)做一些技術(shù)準(zhǔn)備桐愉,把學(xué)習(xí)Touch ID方面的知識做個(gè)總結(jié),待真正開發(fā)時(shí)掰派,應(yīng)用上去从诲。
開發(fā)步驟
首先,touchId功能靡羡,用到了蘋果自帶的LocalAuthentication框架系洛。具體開發(fā)步驟如下:
- 判斷手機(jī)是否支持TouchID功能。
LAContext.init().canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) - 判斷驗(yàn)證指紋密碼是否成功等
LAContext.init().evaluatePolicy(policy: ***, localizedReason: ***, reply: ***)
它有多個(gè)結(jié)果 略步,如下:
let code = ((eror as NSError?)?.code as? Int32 ) ?? 0
switch code {
case kLAErrorSystemCancel:
print("系統(tǒng)取消授權(quán)描扯,如其他APP切入")
case kLAErrorUserCancel:
print("用戶取消驗(yàn)證Touch ID")
case kLAErrorAuthenticationFailed:
print("授權(quán)失敗")
case kLAErrorPasscodeNotSet:
print("系統(tǒng)未設(shè)置密碼")
case kLAErrorTouchIDNotAvailable:
print("設(shè)備Touch ID不可用,例如未打開")
case kLAErrorTouchIDNotEnrolled:
print("設(shè)備Touch ID不可用趟薄,用戶未錄入")
case kLAErrorUserFallback:
DispatchQueue.main.async {
print("用戶選擇輸入密碼绽诚,切換主線程處理")
}
default:
DispatchQueue.main.async {
print("其他情況,切換主線程處理")
}
}
測試寫的demo如下:
封封裝成一個(gè)工具類
/// 指紋識別技術(shù)
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及以上版本執(zhí)行-(void)authenticateUser方法杭煎,方法自動(dòng)判斷設(shè)備是否支持和開啟Touch ID
if version.doubleValue > 8.0 {
// Evaluate: 評估,評價(jià)
// policy: 政策,方法
// 判斷是否可以使用TouchID
let canUseTouchID = XYJTouchIDTool.shareTool.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error)
if canUseTouchID {
print("你的設(shè)備開啟了指紋驗(yàn)證功能");
XYJTouchIDTool.shareTool.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: "這個(gè)一般用來描述請求用戶提供指紋進(jìn)行驗(yàn)證的文本提示內(nèi)容恩够,該內(nèi)容提示用戶為什么需要使用指紋驗(yàn)證的內(nèi)容---如:利用他解鎖(支付)", reply: { (result, eror) in
if result == true { // 判斷驗(yàn)證是否成功
print("驗(yàn)證成功")
} else {
let code = ((eror as NSError?)?.code as? Int32 ) ?? 0
switch code {
case kLAErrorSystemCancel:
print("系統(tǒng)取消授權(quán),如其他APP切入")
case kLAErrorUserCancel:
print("用戶取消驗(yàn)證Touch ID")
case kLAErrorAuthenticationFailed:
print("授權(quán)失敗")
case kLAErrorPasscodeNotSet:
print("系統(tǒng)未設(shè)置密碼")
case kLAErrorTouchIDNotAvailable:
print("設(shè)備Touch ID不可用羡铲,例如未打開")
case kLAErrorTouchIDNotEnrolled:
print("設(shè)備Touch ID不可用蜂桶,用戶未錄入")
case kLAErrorUserFallback:
DispatchQueue.main.async {
print("用戶選擇輸入密碼,切換主線程處理")
}
default:
DispatchQueue.main.async {
print("其他情況也切,切換主線程處理")
}
}
}
})
} else {
print("不支持指紋識別")
}
}
}
}