實用知識:指紋識別功能的實現

#import "ViewController.h"

// iPhone5S開始, 6S第二代, 指紋識別驗證 YES/NO

// 授權驗證, 指紋識別框架
#import <LocalAuthentication/LocalAuthentication.h>

@interface ViewController ()

// 指紋識別
@property (strong, nonatomic) LAContext *context;

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 彈出指紋驗證
    self.context = [[LAContext alloc] init];

    // 判斷硬件是否支持
    /**
     LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,  // 指紋識別, 5次失敗上鎖
     LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication    // 指紋識別, 6次失敗上鎖
     */
    NSError *error;
    // 判斷設備是否可以使用指紋識別
    BOOL isAuthentication = [self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
    if (isAuthentication == NO || error) {
        NSLog(@"不能使用: %@", error);
        return;
    }

    /**
     請求進行指紋識別
     localizedReason: 告訴用戶使用指紋識別的目的
     */
    NSString *reason = @"使用指紋進行用戶登陸";
    [self.context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:reason reply:^(BOOL success, NSError * _Nullable error) {

        /**
         // 指紋驗證失敗
         LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,

         // 用戶取消, 點擊了取消按鈕
         LAErrorUserCancel           = kLAErrorUserCancel,

         // 用戶取消, 點出了輸入密碼
         LAErrorUserFallback         = kLAErrorUserFallback,

         // 系統取消, (比如App進入後臺)
         LAErrorSystemCancel         = kLAErrorSystemCancel,

         // 不能開始指紋驗證, 設備沒有設置密碼
         LAErrorPasscodeNotSet       = kLAErrorPasscodeNotSet,

         // 不能開始指紋驗證, Touch ID 不能用
         LAErrorTouchIDNotAvailable  = kLAErrorTouchIDNotAvailable,

         // 不能開始指紋驗證, Touch ID 沒有錄入指紋
         LAErrorTouchIDNotEnrolled   = kLAErrorTouchIDNotEnrolled,

         // 指紋驗證失敗, 太多次的驗證失敗導致
         // TouchID 鎖住了, 需要輸入密碼
         LAErrorTouchIDLockout   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,

         // App 取消了指紋驗證
         LAErrorAppCancel        NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,

         /// LAContext passed to this call has been previously invalidated.
         LAErrorInvalidContext   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
         */

        if (error) {
            switch (error.code) {
                case LAErrorAuthenticationFailed:
                    NSLog(@"指紋驗證失敗");
                    break;
                case LAErrorUserCancel:
                    NSLog(@"用戶取消了指紋驗證");
                    break;
                case LAErrorSystemCancel:
                    NSLog(@"系統取消了指紋驗證");
                    break;
                default:
                    break;
            }
        }

        // 結果回調
        if (success) {
            NSLog(@"驗證成功");
            // 執行相關的功能代碼
        }
    }];
}

@end
發佈了631 篇原創文章 · 獲贊 10 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章