前提:
首先TouchID 支持 iOS 8.0+;
FaceID 支持 iOS 11.0+;
開啟權限:
調用FaceID需要開啟權限,即在info.plist文件里設置NSFaceIDUsageDescription,相當于調定位、相冊權限一樣;
引入框架:
#import <LocalAuthentication/LocalAuthentication.h>
關鍵方法和參數:
1. LAPolicy
在這里簡單介紹一下LAPolicy,它是一個枚舉.我們根據自己的需要選擇LAPolicy,它提供兩個值:
LAPolicyDeviceOwnerAuthenticationWithBiometrics和LAPolicyDeviceOwnerAuthentication.
<1>. LAPolicyDeviceOwnerAuthenticationWithBiometrics是支持iOS8以上系統,使用該設備的TouchID進行驗證,當輸入TouchID驗證5次失敗后,TouchID被鎖定,只能通過鎖屏后解鎖設備時輸入正確的解鎖密碼來解鎖TouchID。
<2>.LAPolicyDeviceOwnerAuthentication是支持iOS9以上系統,使用該設備的TouchID或設備密碼進行驗證,當輸入TouchID驗證5次失敗后,TouchID被鎖定,會觸發設備密碼頁面進行驗證。
2. canEvaluatePolicy
使用canEvaluatePolicy方法判斷設備是否支持TouchID,返回BOOL為YES,該設備支持TouchID。
? if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
error為返回驗證錯誤碼..
}
LAError
typedef NS_ENUM(NSInteger, LAError)
{
? ? //身份驗證不成功,因為用戶無法提供有效的憑據。
? ? LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
? ? //認證被用戶取消(例如了取消按鈕)。
? ? LAErrorUserCancel = kLAErrorUserCancel,
? ? //認證被取消了,因為用戶利用回退按鈕(輸入密碼)。
? ? LAErrorUserFallback = kLAErrorUserFallback,
? ? //身份驗證被系統取消了(如另一個應用程序去前臺)。
? ? LAErrorSystemCancel = kLAErrorSystemCancel,
? ? //身份驗證無法啟動,因為設備沒有設置密碼。
? ? LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
? ? //身份驗證無法啟動,因為觸摸ID不可用在設備上。
? ? LAErrorTouchIDNotAvailable NS_ENUM_DEPRECATED(10_10, 10_13, 8_0, 11_0, "use LAErrorBiometryNotAvailable") = kLAErrorTouchIDNotAvailable,
? ? //身份驗證無法啟動,因為沒有登記的手指觸摸ID。
? ? LAErrorTouchIDNotEnrolled NS_ENUM_DEPRECATED(10_10, 10_13, 8_0, 11_0, "use LAErrorBiometryNotEnrolled") = kLAErrorTouchIDNotEnrolled,
? ? //驗證不成功,因為有太多的失敗的觸摸ID嘗試和觸///摸現在ID是鎖著的。
? ? //解鎖TouchID必須要使用密碼,例如調用LAPolicyDeviceOwnerAuthenti//cationWithBiometrics的時候密碼是必要條件。
? ? //身份驗證不成功,因為有太多失敗的觸摸ID嘗試和觸摸ID現在被鎖定。
? ? LAErrorTouchIDLockout NS_ENUM_DEPRECATED(10_11, 10_13, 9_0, 11_0, "use LAErrorBiometryLockout")
? ? __WATCHOS_DEPRECATED(3.0, 4.0, "use LAErrorBiometryLockout") __TVOS_DEPRECATED(10.0, 11.0, "use LAErrorBiometryLockout") = kLAErrorTouchIDLockout,
? ? //應用程序取消了身份驗證(例如在進行身份驗證時調用了無效)。
? ? LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
? ? //LAContext傳遞給這個調用之前已經失效。
? ? LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext,
? ? //身份驗證無法啟動,因為生物識別驗證在當前這個設備上不可用。
? ? LAErrorBiometryNotAvailable NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotAvailable,
? ? //身份驗證無法啟動,因為生物識別沒有錄入信息。
? ? LAErrorBiometryNotEnrolled NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotEnrolled,
? ? //身份驗證不成功,因為太多次的驗證失敗并且生物識別驗證是鎖定狀態。此時,必須輸入密碼才能解鎖。例如LAPolicyDeviceOwnerAuthenticationWithBiometrics時候將密碼作為先決條件。
? ? LAErrorBiometryLockout NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryLockout,
? ? //身份驗證失敗。因為這需要顯示UI已禁止使用interactionNotAllowed屬性。? 據說是beta版本
? ? LAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0)) = kLAErrorNotInteractive,
} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
3. evaluatedPolicyDomainState
context.evaluatedPolicyDomainState用于判斷設備上的指紋是否被更改,在LAContext被創建的時候,evaluatedPolicyDomainState才生效,可在TouchID驗證成功時,將它記錄下來,用于下次使用TouchID時校驗,提高安全性。
4. evaluatePolicy
evaluatePolicy方法是對TouchID進行驗證,Block回調中如果success為YES則驗證成功,為NO驗證失敗,并對error進行解析.
5. iOS 11 新增屬性 LABiometryType biometryType
用來判斷是 TouchID 還是 FaceID,只有當canEvaluatePolicy:生物識別策略成功之后才會去設置這個屬性的值。簡單來說意思就是 biometryType 這個屬性的值只有在你調用canEvaluatePolicy:方法之后并且返回是YES沒有錯誤的情況下才會設置,才會有值。在調用 canEvaluatePolicy: 方法前,或者調用后但是有Error的情況下,該屬性均無任何有意義的值,驗證之后實際為空。
typedef NS_ENUM(NSInteger, LABiometryType)
{
? ? /// The device does not support biometry.
? ? LABiometryNone,
? ? /// The device supports Touch ID.
? ? LABiometryTypeTouchID,
? ? /// The device supports Face ID.
? ? LABiometryTypeFaceID,
} NS_ENUM_AVAILABLE(NA, 11_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
/// Indicates the type of the biometry supported by the device.
///
/// @discussion? This property is set only when canEvaluatePolicy succeeds for a biometric policy.
///? ? ? ? ? ? ? The default value is LABiometryNone.
@property (nonatomic, readonly) LABiometryType biometryType NS_AVAILABLE(NA, 11_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
登錄開啟TouchID/FaceID流程:
1、首次使用密碼登錄,登錄成功后,去判斷設備是否支持 TouchID/FaceID ,如果支持,可以設置一個按鈕用來開啟 TouchID/FaceID;
2、點擊開啟后,驗證用戶 TouchID/FaceID 是否開啟成功;
3、TouchID/FaceID 開啟成功后,將登錄賬號、登錄密碼、設備uuid、加密,生成字符串,保存在keychain;
4、將3中生成的字符串拿到服務端做保存,相當于做綁定;
5、保存成功,下次再次登錄將驗證 TouchID/FaceID;
具體代碼:
可參考: