1.說明
iOS 8.0向第三方開放了TouchID的API,可以通過指紋進行登錄或者其他的安全校驗。在iOS 8以上的工程中,導入LocalAuthentication。
TouchID使用比較簡單,并不提供獲取指紋數據的信息,使用LocalAuthentication中的LAContext.h和LAError.h兩個頭文件,LAError.h提供錯誤碼,LAContext.h提供以下兩種方法:
1.canEvaluatePolicy,監測設備是否支持TouchID,返回BOOL,并且若不支持,則在error里面返回相應狀態;
2.evaluatePolicy,TouchID驗證狀態,在block里面返回驗證狀態BOOL和error。
2.使用
下面自定義了一個工具類,具體的情況查看Demo
2.1.導入頭文件
#import <LocalAuthentication/LocalAuthentication.h>
2.2.判斷系統版本
判斷當前系統版本是否支持TouchID的API,iOS 8.0以上的系統才支持,這里寫了一個宏判斷系統版本,在Version為輸入的版本。
#define Later(Version) [UIDevice currentDevice].systemVersion.floatValue >= Version
2.3.初始化LAContext對象
初始化LAContext對象,localizedCancelTitle自定義取消按鈕的文字,支持iOS 10以上系統,localizedFallbackTitle設置這個屬性后,取消按鈕旁邊會多一個按鈕,可在調起TouchID時,調用其他功能,內容為空時不顯示。
LAContext *context = [[LAContext alloc] init];
2.4.LAPolicy
在驗證設備是否支持TouchID之前,先說一下LAPolicy這個屬性,它是一個枚舉,這里根據自己的需要選擇LAPolicy,它提供兩個值:LAPolicyDeviceOwnerAuthenticationWithBiometrics和LAPolicyDeviceOwnerAuthentication。
1.LAPolicyDeviceOwnerAuthenticationWithBiometrics是支持iOS 8以上系統,使用該設備的TouchID進行驗證,當輸入TouchID驗證5次失敗后,TouchID被鎖定,只能通過鎖屏后解鎖設備時輸入正確的解鎖密碼來解鎖TouchID。
2.LAPolicyDeviceOwnerAuthentication是支持iOS9以上系統,使用該設備的TouchID或者設備密碼進行驗證,當輸入TouchID驗證5次失敗后,TouchID被鎖定,會觸發設備密碼頁面進行驗證。
2.5.canEvaluatePolicy
使用canEvaluatePolicy方法判斷設備是否支持TouchID,返回BOOL為YES,該設備支持TouchID。
[context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]
error返回驗證錯誤碼,對errorCode進行處理,LAErrorTouchIDLockout 、LAErrorAppCancel 和LAErrorInvalidContext iOS 9后才提供的錯誤碼,具體的錯誤碼如下:
switch (error) {
case LAErrorAuthenticationFailed://1
{
//身份驗證并不成功,因為用戶沒有提供有效的憑證。
break;
}
case LAErrorUserCancel://2
{
//認證被取消了由用戶(例如了取消按鈕)。
break;
}
case LAErrorUserFallback://3
{
//身份驗證被取消了,因為用戶點擊了后退按鈕(輸入密碼)。
break;
}
case LAErrorSystemCancel://4
{
//身份驗證被系統取消了(如另一個應用程序去前臺)。
break;
}
case LAErrorPasscodeNotSet://5
{
//身份驗證無法啟動,因為密碼不是在設備上設置的。
break;
}
case LAErrorTouchIDNotAvailable://6
{
//身份驗證無法啟動,因為設備上無法使用Touch ID。
break;
}
case LAErrorTouchIDNotEnrolled://7
{
//身份驗證無法啟動,因為Touch ID沒有注冊的手指。
break;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
case LAErrorTouchIDLockout://8
{
//連續五次指紋識別錯誤,TouchID功能被鎖定,下一次需要輸入系統密碼
break;
}
case LAErrorAppCancel://9
{
//如突然來了電話,電話應用進入前臺,APP被掛起啦
break;
}
case LAErrorInvalidContext://10
{
//LAContext傳遞給這個調用之前已經失效
break;
}
#else
#endif
default:
{
break;
}
}
2.6.evaluatedPolicyDomainState
context.evaluatedPolicyDomainState用于判斷設備上的指紋是否被更改,在LAContext被創建的時候,evaluatedPolicyDomainState才生效,可在TouchID驗證成功時,將它記錄下來,用于下次使用TouchID時校驗,提高安全性。
2.7.evaluatePolicy
evaluatePolicy進行TouchID校驗,Block回調,success為YES驗證成功,success為NO驗證失敗,對error進行處理。localizedReason是TouchID驗證時的文字提示。TouchID驗證時調用的是子線程,所以Block中要調用主線程處理。
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReason reply:^(BOOL success, NSError * _Nullable error) {}]
3.最后
可在模擬器上測試TouchID,Simulator->Hardware->Touch ID,功能分別是指紋已經錄入,驗證成功,驗證失敗。
demo中實現功能:
1.判斷設置是否支持TouchID
2.校驗TouchID,對指紋是否修改進行判斷、錯誤碼處理、指紋5次校驗失敗被鎖定,調起設備密碼,輸入正確密碼,解鎖指紋,類似支付指紋登錄功能。
PS:這只是一個簡單的教程,具體深入靠大家了,附上Demo地址,源碼地址