前言
iOS 8 SDK向開發者公布了Touch ID指紋識别功能,允許App對使用者身份進行本地驗證。
Touch ID支援系統和機型
iOS系統的Touch ID指紋識别功能最低支援的機型為iPhone 5s,最低支援系統為iOS 8.
依賴架構
該架構下隻有兩個頭檔案:
LAContext.h
LAError.h
LAContext
簡介
通過該對象可完成指紋識别。
typedef NS_ENUM(NSInteger, LAPolicy)
{
// 指紋驗證
LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, _0) __WATCHOS_AVAILABLE() __TVOS_AVAILABLE() = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,
// 使用Touch ID或者密碼驗證,預設是錯誤兩次指紋或者鎖定後,彈出輸入密碼界面
LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(_11, _0) = kLAPolicyDeviceOwnerAuthentication
};
常用屬性
// 回退按鈕标題
// 預設标題為“輸入密碼”,當設定成空字元串的時候,該按鈕被隐藏
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
// 取消按鈕标題
// 設定驗證TouchID時彈出Alert的取消按鈕的标題
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle;
// 允許驗證失敗最大次數
@property (nonatomic, nullable) NSNumber *maxBiometryFailures;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState;
// 指定TouchID驗證的間隔,間隔期之内可以免驗證讀取Keychain資料
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration;
核心函數
// 判斷裝置是否支援Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
// 驗證身份的函數
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
LAError
簡介
主要用于Touch ID驗證身份失敗後的一些錯誤處理。
核心函數
typedef NS_ENUM(NSInteger, LAError)
{
// 授權失敗
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 使用者取消Touch ID授權
LAErrorUserCancel = kLAErrorUserCancel,
// 使用者選擇輸入密碼
LAErrorUserFallback = kLAErrorUserFallback,
// 系統取消授權(例如其他APP切入)
LAErrorSystemCancel = kLAErrorSystemCancel,
// 系統未設定密碼
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
// 裝置Touch ID不可用,例如未打開
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
// 裝置Touch ID不可用,使用者未錄入
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
// 使用者多次連續使用Touch ID失敗,Touch ID被鎖,需要使用者輸入密碼解鎖,這個錯誤的互動LocalAuthentication.framework已封裝過,不需要開發者處理
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(_11, _0) __WATCHOS_AVAILABLE() __TVOS_AVAILABLE() = kLAErrorTouchIDLockout,
// 與LAErrorSystemCancel相似,都是目前軟體被挂起取消了授權,LAErrorAppCancel該錯誤是使用者自己切到了别的應用,例如按Home鍵挂起。
LAErrorAppCancel NS_ENUM_AVAILABLE(_11, _0) = kLAErrorAppCancel,
// 授權過程中,LAContext對象被釋放掉了,造成的授權失敗
LAErrorInvalidContext NS_ENUM_AVAILABLE(_11, _0) = kLAErrorInvalidContext
}
代碼
核心代碼
//建立LAContext執行個體
LAContext *authenticationContext= [[LAContext alloc]init];
authenticationContext.localizedFallbackTitle = @"點,驗證其他";
NSError *error;
//1:檢查Touch ID 是否可用
if ([authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
NSLog(@"touchId 可用");
//2:執行認證政策
[authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要驗證您的指紋來确認您的身份資訊" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"通過了Touch Id指紋驗證");
}else{
NSLog(@"error===%@",error);
switch (error.code) {
case LAErrorAuthenticationFailed:{//授權失敗
NSLog(@"Authentication Failed");
break;
}
case LAErrorUserCancel:{// 使用者取消Touch ID授權
NSLog(@"Authentication was cancelled by the user");
break;
}
case LAErrorUserFallback:{//使用者選擇輸入密碼
NSLog(@"User selected to enter custom password");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// TODO SOMETHING
}];
break;
}
case LAErrorSystemCancel:{//系統取消授權(例如其他APP切入)
NSLog(@"Authentication was cancelled by the system");
//切換到其他APP,系統取消驗證Touch ID
break;
}
case LAErrorAppCancel:{//與LAErrorSystemCancel相似,都是目前軟體被挂起取消了授權,LAErrorAppCancel該錯誤是使用者自己切到了别的應用,例如按Home鍵挂起。
NSLog(@"app cancle the authentication");
break;
}
case LAErrorInvalidContext:{//授權過程中,LAContext對象被釋放掉了,造成的授權失敗
NSLog(@"context is invalidated");
break;
}
default:{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情況,切換主線程處理
}];
break;
}
}
}
}];
}else{
//todo goto 輸入密碼頁面
NSLog(@"error====%@",error);
NSLog(@"抱歉,touchId 不可用");
}
Demo位址
Demo位址