iOS TouchID 和 FaceID 的使用 - 登錄

前提:

首先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;


具體代碼:

可參考:

http://www.lxweimin.com/p/c784d1ac646d

http://www.lxweimin.com/p/c387614b70ce

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容