指紋識別官方API
// 導(dǎo)入資源
LocalAuthentication.framework
// 導(dǎo)入頭文件
#import <LocalAuthentication/LocalAuthentication.h>
資源下主要文件是
- LAError.h
- LAContext.h
- LAPublicDefines.h
- LocalAuthentication.h
- LocalAuthentication.h 就是一個公開接口嗤无,供調(diào)用
- LAError.h 系統(tǒng)定義的錯誤類型
typedef NS_ENUM(NSInteger, LAError)
{
LAErrorAuthenticationFailed, // 驗證信息出錯坪稽,指紋驗證不匹配
LAErrorUserCancel // 用戶取消了驗證(例如點擊返回按鈕)
LAErrorUserFallback // 用戶點擊了fallback按鈕锹淌,去手動輸入密碼
LAErrorSystemCancel // 系統(tǒng)取消七兜,其他app在前臺,驗證的時候app進入了后臺
LAErrorPasscodeNotSet // 用戶沒有設(shè)置密碼,無法開啟指紋驗證
LAErrorTouchIDNotAvailable // 用戶設(shè)備不支持TouchID
LAErrorTouchIDNotEnrolled // 用戶沒有設(shè)置手指指紋
LAErrorTouchIDLockout // 由于多次指紋驗證失敗導(dǎo)致 TouchID已經(jīng)被鎖定,現(xiàn)在只可以用密碼去解鎖TouchID
LAErrorAppCancel // 在驗證中被其他app中斷
LAErrorInvalidContext // 請求驗證出錯
} NS_ENUM_AVAILABLE(10_10, 8_0);
- LAPublicDefines.h 一個宏定義文件
// Policies
#define kLAPolicyDeviceOwnerAuthenticationWithBiometrics 1
#define kLAPolicyDeviceOwnerAuthentication 2
// Options
#define kLAOptionUserFallback 1
#define kLAOptionAuthenticationReason 2
// Credential types
#define kLACredentialTypePasscode -1
#define kLACredentialTypePassphrase -2
#define kLACredentialCTKPIN -3
// Error codes
#define kLAErrorAuthenticationFailed -1
#define kLAErrorUserCancel -2
#define kLAErrorUserFallback -3
#define kLAErrorSystemCancel -4
#define kLAErrorPasscodeNotSet -5
#define kLAErrorTouchIDNotAvailable -6
#define kLAErrorTouchIDNotEnrolled -7
#define kLAErrorTouchIDLockout -8
#define kLAErrorAppCancel -9
#define kLAErrorInvalidContext -10
// Error domain
#define kLAErrorDomain "com.apple.LocalAuthentication"
- LAContext.h 主要的使用文件
typedef NS_ENUM(NSInteger, LAPolicy)
{
// 這種情況就是指紋識別伦连,如果指紋識別失敗,導(dǎo)致TouchID被鎖定钳垮,則再次調(diào)用這個驗證惑淳,會一致處于LAErrorTouchIDLockout狀態(tài),除非你重新解鎖TouchID饺窿。我只發(fā)現(xiàn)了關(guān)閉屏幕歧焦,輸入密碼解鎖,才可以重新使用指紋識別功能
LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(10_12_2, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,
// 這種情況下當指紋識別失敗一定次數(shù)后肚医,會主動調(diào)用系統(tǒng)的密碼輸入界面去解鎖你的指紋識別功能倚舀,或者你在識別失敗后的再試一次的界面叹哭,點擊輸入密碼調(diào)用系統(tǒng)的密碼輸入界面
LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication
} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
/// The maximum value for LAContext touchIDAuthenticationAllowableReuseDuration property.
extern const NSTimeInterval LATouchIDAuthenticationMaximumAllowableReuseDuration NS_AVAILABLE(10_12, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
NS_CLASS_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0)
@interface LAContext : NSObject
// 在調(diào)用驗證指紋識別前,先查詢下本機是否支持指紋識別功能
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
// 調(diào)用指紋識別
// 第一個參數(shù)是識別的類型詳解參考上面的枚舉LAPolicy
// 第二參數(shù)是你請求指紋解鎖的原因痕貌,不可以為nil或者@""风罩,會crash,
// 第三個為回調(diào)函數(shù)舵稠,成功或者失敗超升,以及失敗的原因
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
// 手動取消這個調(diào)用對象context(LAContext *context = [[LAContext alloc] init];)
- (void)invalidate NS_AVAILABLE(10_11, 9_0);
/*
暫時沒有LACredentialType 這個相關(guān)的應(yīng)用場景
*/
typedef NS_ENUM(NSInteger, LACredentialType)
{
// 證書類型為密碼類型
LACredentialTypeApplicationPassword __TVOS_UNAVAILABLE = 0,
} NS_ENUM_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
// 設(shè)置一個內(nèi)部評估時使用的身份驗證憑據(jù)
// 設(shè)置這個參數(shù)為nil將會刪除指定類型的任何現(xiàn)有的憑證。
- (BOOL)setCredential:(nullable NSData *)credential
type:(LACredentialType)type NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;
// 是否是某個類型哺徊,現(xiàn)在只有一個類型
- (BOOL)isCredentialSet:(LACredentialType)type NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;
/*
暫時沒有LAAccessControlOperation 這個相關(guān)的應(yīng)用場景
*/
typedef NS_ENUM(NSInteger, LAAccessControlOperation)
{
/// Access control will be used for item creation.
LAAccessControlOperationCreateItem,
/// Access control will be used for accessing existing item.
LAAccessControlOperationUseItem,
/// Access control will be used for key creation.
LAAccessControlOperationCreateKey,
/// Access control will be used for sign operation with existing key.
LAAccessControlOperationUseKeySign,
/// Access control will be used for data decryption using existing key.
LAAccessControlOperationUseKeyDecrypt NS_ENUM_AVAILABLE(10_12, 10_0),
/// Access control will be used for key exchange.
LAAccessControlOperationUseKeyKeyExchange NS_ENUM_AVAILABLE(10_12, 10_0),
} NS_ENUM_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
- (void)evaluateAccessControl:(SecAccessControlRef)accessControl
operation:(LAAccessControlOperation)operation
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply
NS_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_UNAVAILABLE;
// 當?shù)谝淮沃讣y驗證失敗后室琢,界面會發(fā)生改變,右側(cè)會出現(xiàn)請輸入密碼提示落追,左側(cè)默認是取消盈滴。右側(cè)的按鈕就是fallback按鈕,內(nèi)容就是fallbacktitle轿钠。如果為@""fallback按鈕則隱藏
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
// 指紋識別默認cancle按鈕title為取消巢钓,你可以改變內(nèi)容在iOS10之后
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
// 指紋識別失敗的次數(shù)設(shè)置,即當失敗多少次之后做什么疗垛,iOS8.3---iOS9.0之間可以設(shè)置
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 當你的指紋有增刪操作后症汹,這個狀態(tài)會發(fā)生變化
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
// 這個屬性可以設(shè)置一個時間間隔,在時間間隔內(nèi)是不需要再次錄入贷腕。默認是0秒背镇,最長可以設(shè)置5分鐘。暫未觸發(fā)這個屬性的應(yīng)用場景
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(10_12, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@end
- 注意事項
// 指紋識別完成后泽裳,回主線程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
// do something
});
參考資料
官方文檔
LocalAuthentication源碼學(xué)習
iOS 指紋識別常見問題匯總