iOS 關於手勢/指紋登陸


1. 手勢

手勢的代碼有很多,可以參考支付寶或者其他人寫的。

手勢/指紋登陸是為了省去輸入密碼的麻煩。參考了中國銀行信用卡App --"繽紛生活",截圖如下

1. 在登陸成功的情況下才能進入 “設置-賬號與安全” 設置手勢/指紋,未登陸時 見圖10

2. 登陸成功時會提示你是否設置輔助登陸密碼,也就是手勢/指紋 ,見圖1

3. 在“設置-賬號與安全” 中點擊開關,會進入到密碼驗證,如果已有手勢,則彈出手勢驗證,見圖2,3,4,5

4. 手勢繪制需要重復繪制2次,錄入成功之后回到開關界面,開關打開,見圖6

5. 圖8,是殺掉App,再次打開App,可見用戶數據都清空了

6. 圖9,有注冊,切換登錄方式這兩個,目的就是為了給不同賬號登陸

 

 

再看這個,我關閉了所有網絡,此時用手勢快捷登陸,會提示網絡故障,由此可以看看出,手勢驗證成功之后,他立即發送了一個登陸的請求。

包括圖9中這個用戶名,可能還有密碼,都會存入沙盒。

 

 

2. 指紋

而指紋驗證,驗證成功了在沙盒存一個標志就可以了。

一般指紋驗證的時候3次失敗了,會有有一個失敗的回調,指紋彈窗消失,需要重新使用evaluatePolicy...方法喚起彈窗。5次失敗則需要輸入手機密碼,然后再次喚起彈窗。

注意使用evaluatePolicy...方法的回調里面如果要操作UI,一定要切換回主線程。

這里參考https://github.com/ITHanYong/TouchID.git把指紋驗證的代碼封裝到一個管理類中,然后回調用通知發出去。在使用的地方,就是要彈出的地方調用就可以了。少走很多彎路。

TouchIDManager.h

//
//  WLFTouchIDManager.h
//  WLFApp
//
//  Created by udc on 2020/1/10.
//  Copyright © 2020 xxx. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface WLFTouchIDManager : NSObject
// 當識別出現每一種情況是會發出通知
+ (void)validateTouchID;
@end
/*
 * 授權成功
 */
UIKIT_EXTERN NSString *const ValidateTouchIDSuccess;
/*
 * 取消按鈕
 */
UIKIT_EXTERN NSString *const ValidateTouchIDCancel;
/*
 * 輸入密碼
 */
UIKIT_EXTERN NSString *const ValidateTouchIDInputPassword;
/*
 * 授權失敗
 */
UIKIT_EXTERN NSString *const ValidateTouchIDAuthenticationFailed;
/*
 * 設備不可用
 */
UIKIT_EXTERN NSString *const ValidateTouchIDNotAvailable;
/*
 * 設備未設置指紋
 */
UIKIT_EXTERN NSString *const ValidateTouchIDNotEnrolled;
/*
 * 設備未設置密碼
 */
UIKIT_EXTERN NSString *const ValidateTouchIDErrorPasscodeNotSet;
/*
 * 指紋設備被鎖定
 */
UIKIT_EXTERN NSString *const ValidateTouchIDLockout;


NS_ASSUME_NONNULL_END
View Code

TouchIDManager.m

//
//  WLFTouchIDManager.m
//  WLFApp
//
//  Created by udc on 2020/1/10.
//  Copyright © 2020 xxx. All rights reserved.
//

#import "WLFTouchIDManager.h"
#import <LocalAuthentication/LocalAuthentication.h>

#define DeviceVersion [[UIDevice currentDevice]systemVersion].doubleValue
/*
 * 授權成功
 */
NSString *const ValidateTouchIDSuccess = @"ValidateTouchIDSuccess";
/*
 * 取消按鈕
 */
NSString *const ValidateTouchIDCancel = @"ValidateTouchIDCancel";
/*
 * 輸入密碼
 */
NSString *const ValidateTouchIDInputPassword = @"ValidateTouchIDInputPassword";
/*
 * 授權失敗
 */
NSString *const ValidateTouchIDAuthenticationFailed = @"ValidateTouchIDAuthenticationFailed";
/*
 * 設備指紋不可用
 */
NSString *const ValidateTouchIDNotAvailable = @"ValidateTouchIDNotAvailable";
/*
 * 設備未設置指紋
 */
NSString *const ValidateTouchIDNotEnrolled = @"ValidateTouchIDNotEnrolled";
/*
 * 設備未設置密碼
 */
NSString *const ValidateTouchIDErrorPasscodeNotSet = @"ValidateTouchIDErrorPasscodeNotSet";
/*
 * 指紋設備被鎖定
 */
NSString *const ValidateTouchIDLockout = @"ValidateTouchIDLockout";

@implementation WLFTouchIDManager

+ (void)validateTouchID
{
    // 判斷系統是否是iOS8.0以上 8.0以上可用
    if (!([[UIDevice currentDevice]systemVersion].doubleValue >= 8.0)) {
        NSLog(@"系統不支持");
        return;
    }
    // 創建LAContext對象
    LAContext *authenticationContext = [[LAContext alloc]init];
    NSError *error = nil;
    authenticationContext.localizedFallbackTitle = @"";
    
    [authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
    if (error.code == LAErrorTouchIDLockout && DeviceVersion >= 9.0) {
        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDLockout object:nil];
        [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"重新開啟TouchID功能" reply:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                [self validateTouchID];
            }
        }];
        return;
    }
    [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"通過Home鍵驗證已有手機指紋" reply:^(BOOL success, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // 指紋識別錯誤調用分為以下情況,
            // 點擊取消按鈕 : domain = com.apple.LocalAuthentication code = -2
            // 點擊輸入密碼按鈕 : domain = com.apple.LocalAuthentication code = -3
            // 輸入密碼重新進入指紋系統 : domain = com.apple.LocalAuthentication code = -8
            // 指紋三次錯誤 : domain = com.apple.LocalAuthentication code = -1
            // 指紋驗證成功 : error = nil
            if (error) {
                switch (error.code) {
                    case LAErrorAuthenticationFailed:
                        NSLog(@"LAErrorAuthenticationFailed");//-1
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDAuthenticationFailed object:nil];
                        break;
                    case LAErrorUserCancel:
                        // 點擊取消按鈕
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDCancel object:nil];
                        break;
                    case LAErrorUserFallback:
                        // 用戶點擊輸入密碼按鈕
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDInputPassword object:nil];
                        break;
                    case LAErrorPasscodeNotSet:
                        //沒有在設備上設置密碼
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDErrorPasscodeNotSet object:nil];
                        break;
                    case LAErrorTouchIDNotAvailable:
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDNotAvailable object:nil];
                        //設備不支持TouchID
                        break;
                    case LAErrorTouchIDNotEnrolled:
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDNotEnrolled object:nil];
                        break;
                        //設備沒有注冊TouchID
                    case LAErrorTouchIDLockout:
                        [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDLockout object:nil];
                        if (DeviceVersion >= 9.0) {
                            [self validateTouchID];
                        }
                        break;
                    default:
                        break;
                }
                return ;
            }
            
            // 說明驗證成功,如果要刷新UI必須在這里回到主線程
            [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDSuccess object:nil];
        });
    }];
}


@end
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM