背景
使用指紋解鎖幼驶,蘋果有一個(gè)小例子凄敢,大體的流程是這樣的:
//代碼塊 1
func attemptLoginWithTouchID() {
let context = LAContext();
var authError: NSError? = nil;
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "使用指紋登錄", reply: { (success, evaluateError) in
if success {
// case 1: 指紋鑒定成功
}
else {
//case 2:指紋鑒定失敗
}
})
}
else {
//case 3: 目前無法進(jìn)行指紋識(shí)別
}
}
進(jìn)行evaluatePolicy
時(shí),如果連續(xù)三次識(shí)別不對(duì)庸追,在 case 2
處失敗一次霍骄,如果再連續(xù)識(shí)別不對(duì)兩次,Touch ID 功能就會(huì)被鎖定锚国,需要輸入設(shè)備密碼解鎖腕巡。
Apple 在 iOS 9 SDK 中玄坦,對(duì)于失敗的情況血筑,加了一條 LAErrorTouchIDLockout
绘沉,然而如果在 evaluatePolicy
的時(shí)候 Touch ID 被鎖,并不會(huì)在 case 2
處失敗豺总,系統(tǒng)會(huì)自動(dòng)彈出密碼框车伞,讓用戶解鎖。這個(gè)過程對(duì)開發(fā)者是透明的喻喳。
但是對(duì)于 iOS 10另玖,情況就不是這樣了。主要有兩點(diǎn)區(qū)別:
- 如果 Touch ID 已經(jīng)被鎖定表伦,那么執(zhí)行
canEvaluatePolicy
的時(shí)候谦去,會(huì)返回false
,但是在 iOS 9 及以前的系統(tǒng)上會(huì)返回true
蹦哼。 - 如果在執(zhí)行
evaluatePolicy
的過程中鳄哭,Touch ID 被鎖定,系統(tǒng)不會(huì)自動(dòng)調(diào)起密碼框解除鎖定纲熏,但是在 iOS 9 及以前的系統(tǒng)上會(huì)這么干妆丘。
那么現(xiàn)在就很尷尬了:如果在進(jìn)行指紋解鎖的時(shí)候,Touch ID 已經(jīng)被鎖定局劲,那么就會(huì)直接跳到 case 3
勺拣,提示目前無法進(jìn)行指紋識(shí)別。那用戶就會(huì)說鱼填,我的指紋識(shí)別明明是好的药有,這個(gè) App 太 SB !
解決方案
在進(jìn)入 case 2
和 case 3
的錯(cuò)誤狀態(tài)后,進(jìn)行判斷苹丸。如果錯(cuò)誤碼是 LAErrorTouchIDLockout
塑猖,可以主動(dòng)調(diào)起密碼框解除 Touch ID 的鎖定。以下是解除鎖定的代碼:
//代碼塊 2
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 {
// Fallback on earlier versions, do nothing...
}
}
如有錯(cuò)誤請(qǐng)指正。