驗證方式
- LAPolicyDeviceOwnerAuthenticationWithBiometrics
iOS8.0以上支持,只有生物校驗功能
生物校驗授權(quán)使用,當設備不具有Touch ID / Face Id 功能,或者在系統(tǒng)設置中沒有設置開啟生物校驗,授權(quán)將會失敗。
前三次生物校驗失敗,生物校驗框不再彈出。再次重新進入驗證,還有兩次驗證機會,如果還是驗證失敗,Touch ID(Face ID)被鎖住不再繼續(xù)彈出生物校驗框。以后的每次驗證都將會彈出設備密碼輸入框直至輸入正確的設備密碼才能重新使用生物校驗
- LAPolicyDeviceOwnerAuthentication
iOS 9.0以上支持,包含生物校驗與輸入密碼的驗證方式
生物校驗和數(shù)字密碼的授權(quán)使用,當生物校驗可用且沒有被鎖定,授權(quán)后會進入生物校驗。不然的話會進入數(shù)字密碼驗證的頁面。當系統(tǒng)數(shù)字密碼沒有設置不可用的時候,授權(quán)失敗。
生物校驗失敗三次將彈出設備密碼輸入框,如果不進行密碼輸入。再次進來還可以有兩次機會進行生物校驗,如果都失敗則Touch ID(Face ID)被鎖住,以后每次進來驗證都是調(diào)用系統(tǒng)的設備密碼直至輸入正確的設備密碼才能重新使用生物校驗
驗證類型
- LABiometryTypeNone / LABiometryNone
不支持生物識別
- LABiometryTypeTouchID
支持 Touch ID
- LABiometryTypeFaceID
支持 Face ID
驗證錯誤類型
- LAErrorAuthenticationFailed
授權(quán)失敗
- LAErrorUserCancel
用戶取消驗證Touch ID
- LAErrorUserFallback
用戶選擇輸入密碼,切換主線程處理
- LAErrorSystemCancel
系統(tǒng)取消授權(quán),如其他APP切入
- LAErrorPasscodeNotSet
系統(tǒng)密碼未設置
- LAErrorTouchIDNotAvailable
設備Touch ID不可用,例如未打開
設備不支持Touch ID/Face ID,iOS 11被標注過時,需要使用LAErrorBiometryNotAvailable代替
- LAErrorTouchIDNotEnrolled
設備Touch ID不可用,用戶未錄入
沒有錄入指紋/人臉,iOS 11被標注過時,需要使用LAErrorBiometryNotEnrolled代替
- LAErrorTouchIDLockout
設備Touch ID不可用,如多次驗證失敗
- LAErrorAppCancel
APP調(diào)用了- (void)invalidate 方法使 LAContext失效
- LAErrorInvalidContext
實例化的LAContext對象失效,再次調(diào)用evaluation...方法則會彈出此錯誤信息
- LAErrorBiometryNotAvailable
設備不支持Touch ID/Face ID,iOS 11新增,由于新增Face ID,故用來代替LAErrorTouchIDNotAvailable
- LAErrorBiometryNotEnrolled
沒有錄入指紋/人臉,iOS 11新增,由于新增Face ID,故用來代替LAErrorTouchIDNotEnrolled
- LAErrorBiometryLockout
超過重試限制,Touch ID/Face ID被鎖定,需要進行設備密碼解鎖后重新激活
- LAErrorNotInteractive
應用尚未啟動完成或者已經(jīng)進入非激活狀態(tài)時調(diào)用驗證方法會收到該錯誤,例如:將驗證方法放到didEnterBackground方法中進行可能會導致這個錯誤
選擇驗證方式
- (void)opinionBiologicalRecognition {
// 系統(tǒng)支持,最低支持iOS 8.0
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// 初始化 LAContext 上下文對象
LAContext *context = [LAContext new];
// 驗證彈框提供兩個按鈕,CancelButton 點擊取消,F(xiàn)allbackButton 點擊輸入數(shù)字密碼,可自定義標題
// 首次驗證失敗后才會出現(xiàn) FallbackButton
context.localizedCancelTitle = @"取消";
context.localizedFallbackTitle = @"使用密碼";
// 初始化錯誤對象指針
NSError *error;
// 判斷驗證方式
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// iOS 11.0 及以上包含指紋及面部識別的機型
if (@available(iOS 11.0, *)) {
// FaceID
if (context.biometryType == LABiometryTypeFaceID) {
[self showFaceIdVerification:context];
}
// TouchID
else if (context.biometryType == LABiometryTypeTouchID) {
[self showTouchIdVerification:context];
}
// iOS 11.0 以下不包含面部識別
} else {
// TouchID
[self showTouchIdVerification:context];
}
}
}
}
Face ID
- (void)showFaceIdVerification:(LAContext *)context {
// 調(diào)用面部識別并初始化提示文案
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"面容ID" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
// 驗證成功,回到主線程做后續(xù)操作
});
} else {
// 驗證失敗,后續(xù)處理
[self dealWithFaceIdOrTouchIdError:error];
}
}];
}
Touch ID
- (void)showFaceIdVerification:(LAContext *)context {
// 調(diào)用指紋識別并初始化提示文案
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請驗證已有的指紋進行支付" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
// 驗證成功,回到主線程做后續(xù)操作
});
} else {
// 驗證失敗,后續(xù)處理
[self dealWithFaceIdOrTouchIdError:error];
}
}];
}
驗證失敗處理
- (void)dealWithFaceIdOrTouchIdError:(NSError *)error {
switch (error.code) {
case LAErrorSystemCancel: {
// 系統(tǒng)取消授權(quán),如其他APP切入
break;
}
case LAErrorUserCancel: {
// 用戶取消驗證Touch ID
break;
}
case LAErrorAuthenticationFailed: {
// 授權(quán)失敗
break;
}
case LAErrorPasscodeNotSet: {
// 系統(tǒng)未設置密碼
break;
}
case LAErrorTouchIDNotAvailable: {
// 設備Touch ID不可用,例如未打開
break;
}
case LAErrorTouchIDNotEnrolled: {
// 設備Touch ID不可用,用戶未錄入
break;
}
case LAErrorUserFallback: {
// 用戶選擇輸入密碼,切換主線程處理
break;
}
default: {
dispatch_async(dispatch_get_main_queue(), ^{
// 其他情況,切換主線程處理
});
break;
}
}
}