最近在app端開發增加一個功能:設備鎖 就是進入app時驗證指紋或者鎖屏密碼。
首先看下翻譯的官網文檔 https://www.cnblogs.com/peterYong/p/12434683.html
Android端
指紋驗證
系統默認每段時間內驗證指紋次數為5次,如果5次后還沒驗證成功,則關閉驗證,並且30秒內不允許再次驗證,即使你調api也沒用。
鎖屏密碼驗證
參考:【確認憑證】
https://docs.microsoft.com/zh-cn/xamarin/android/platform/marshmallow
注意:
- 跳轉系統解鎖頁面只能在5.0以上的設備使用,5.0以下的不支持
- 如果不對設備進行設置密碼判斷,intent就會返回一個null, 一定要對null值進行判斷
核心是:調用系統的鎖屏密碼界面,輸入密碼,判斷返回結果是否正確,正確則執行后續邏輯

KeyguardManager keyguardManager = (KeyguardManager)GetSystemService(Context.KeyguardService); Intent intent = keyguardManager.CreateConfirmDeviceCredentialIntent("輸入鎖屏密碼", null); if (intent != null) { StartActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS); } protected override async void OnActivityResult(int requestCode, Result resultCode, Intent data) { if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS && resultCode == Result.Ok) { if (resultCode == Result.Ok) { HUD hUD = new HUD(); hUD.ShowProgress(AppResource.加載中); await Task.Delay(500); StartMainActivity(); hUD.Dismiss(); } else { Toast.MakeText(this, "密碼錯誤,請重試。", ToastLength.Long).Show(); } } }
Activity跳轉及傳遞參數,參考:
startActivity與startActivityForResult的使用小結
生物識別
到了AndroidP(Android9.0),FingerprintManager
就正式退役了,系統新增了BiometricPrompt
接口(包括面部識別)【暫未對接】
問題:
1、在實際運行中,碰到后續邏輯是比較耗時的情況,想提前關閉打開的鎖屏界面,FinishActivity(REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
但是一直不生效。而且想打開一個進度圈提醒用戶也不生效。
方案:於是將OnActivityResult 改為異步方法,等待500毫秒,再去打開進度圈。
2、CreateConfirmDeviceCredentialIntent 打開系統的鎖屏密碼輸入框
對於Android10和以上版本的系統,會自動打開含指紋和密碼的驗證框;
對於Android10以下的,只會打開密碼的驗證框。想打開指紋驗證框,需要自定義,見 Android的Fingerprint Authentication
IOS端
基本功能
canEvaluatePolicy:error:
方法用來檢查當前設備是否可用touchID,返回一個BOOL值;不會彈驗證指紋密碼框evaluatePolicy:localizedReason:reply:
調用驗證方法,會彈驗證指紋密碼框
沒有設置指紋,則會自動回退到鎖屏密碼框,都是調系統的彈窗!
指紋驗證
1、說明
雖然安裝iOS 7系統的5s機型可以使用系統提供的指紋解鎖功能,但由於API並未開放,所以理論上第三方軟件不可使用。
指紋驗證功能的最低硬件支持為iPhone5s,iPad 6,iPad mini 3這些有touch ID硬件支持的設備。
2、TouchID 的校驗方式
- LAPolicyDeviceOwnerAuthenticationWithBiometrics:指紋驗證。首次啟動有三次驗證的機會,失敗后TouchID校驗的彈框會消失。再次啟動有兩次機會,如果還失敗,TouchID就會被鎖定,后面再啟動程序TouchID就不會在彈出。這里我們需要用下面一種校驗方式來解除TouchID的鎖定
- LAPolicyDeviceOwnerAuthentication:指紋驗證+系統密碼驗證。如果TouchID正常錄入則優先使用TouchID,如果出現上面那種情況,TouchID被鎖定,就需要用系統密碼校驗來解除鎖定(調用此方法,重新發起驗證)。
LAPolicyDeviceOwnerAuthenticationWithBiometrics :
生物指紋識別。驗證彈框有兩個按鈕,第一個是取消按鈕,第二個按鈕可以自定義標題名稱(輸入密碼)。只有在第一次指紋驗證失敗后才會出現第二個按鈕,這種鑒定方式的第二個按鈕的功能自定義。前三次指紋驗證失敗,指紋驗證框不再彈出。再次重新進入驗證,還有兩次驗證機會,如果還是驗證失敗,TOUCH ID 被鎖住不再繼續彈出指紋驗證框。以后的每次驗證都將會彈出設備密碼輸入框直至輸入正確的設備密碼方可解除TOUCH ID鎖。
LAPolicyDeviceOwnerAuthentication:
生物指紋識別或系統密碼驗證。如果TOUCH ID 可用,且已經錄入指紋,則優先調用指紋驗證。其次是調用系統密碼驗證,如果沒有開啟設備密碼,則不可以使用這種驗證方式。指紋識別驗證失敗三次將彈出設備密碼輸入框,如果不進行密碼輸入。再次進來還可以有兩次機會驗證指紋,如果都失敗則TOUCH ID被鎖住,以后每次進來驗證都是調用系統的設備密碼直至輸入正確的設備密碼方可解除TOUCH ID鎖。
驗證錯誤枚舉:
-1=LAErrorAuthenticationFailed, // 驗證信息出錯,就是說你指紋不對。【授權失敗,代表連續三次指紋識別錯誤】
-2=LAErrorUserCancel // 用戶取消了驗證 【在TouchID對話框中點擊了 取消按鈕】
-3=LAErrorUserFallback // 用戶點擊了手動輸入密碼的按鈕,所以被取消了
-4=LAErrorSystemCancel // 被系統取消,就是說你現在進入別的應用了【TouchID對話框被系統取消,例如按下Home或者電源鍵】
-5=LAErrorPasscodeNotSet // 用戶設備沒有設置密碼
-6=LAErrorTouchIDNotAvailable // 用戶設備不支持TouchID
-7=LAErrorTouchIDNotEnrolled // 用戶沒有設置手指指紋
-8=LAErrorTouchIDLockout // 用戶錯誤次數太多,現在被鎖住了 【三次之后,又錯了兩次,下一次需要輸入系統密碼】
-9=LAErrorAppCancel // 在驗證中被其他app中斷 【如突然來了電話,電話應用進入前台,APP被掛起啦】
-10=LAErrorInvalidContext // 請求驗證出錯
3、常見問題
版本問題
-
iOS 9 之前是沒有
LAErrorTouchIDLockout
鎖定這個選項的,默認錯誤5次后;第6次驗證是自動彈出輸入密碼界面; -
iOS 9 之后(現在設備大多是這個版本)鎖定指紋識別之后,如果需要立即彈出輸入密碼界面需要使用
LAPolicyDeviceOwnerAuthentication
這個屬性重新發起驗證 - 如果輸入了鎖屏密碼,指紋解密鎖定會默認解除
EvaluatePolicy函數中第二個參數localizedReason
var localizedReason = new NSString("Verify fingerprint"); //驗證指紋【下圖再試一次下面的文字】,(參數不能為空,否則報錯)
feedback按鈕顯示
- 默認第一次識別只有取消按鈕
- 錯誤一次之后,會顯示 feedBack 按鈕
- 如果不想顯示 feedback 按鈕,可以設置
feedBackTitle = @""
指紋識別慢的問題
- 指紋識別啟動過程有時需要2s 左右的時間,如果發現啟動比較慢,這個是正常現象
- 支付寶和微信為了消除用戶的緊張情緒,在開啟指紋識別的時候都有放 HUD
- 指紋識別完成后,需要返回主線程進行相應的操作;否者你會發現有時候識別完4-5秒才有反應
參考:
TouchID--kLAErrorTouchIDLockout--解除
iOS 指紋識別常見問題匯總(**)